【问题标题】:Junit test function which returns a stringJunit 测试函数,它返回一个字符串
【发布时间】:2017-07-25 21:26:53
【问题描述】:

我在一个类中有一个函数:

public String covertToLowerCase(String sliceName) {
        sliceName = sliceName.trim().toLowerCase();
        sliceName = sliceName.replaceAll("\\.txt$|\\.dat$", "");
        return sliceName;
    }

我想使用 Junit 进行测试。我创建了一个单独的测试文件,其中包含以下内容:

  public class MyControllerTest {

  private MyController myController;
  private static final String SLICE_NAME = "Hello World";

  @Test
  public void shouldReturnSanitizedString() throws Exception {
  String expected = myController.covertToLowerCase(SLICE_NAME);
  // assert that actual and expected are same
  }

我无法理解如何对此进行测试,并且所有其他示例都特定于它们的功能。我只是想让函数返回一个经过清理的字符串?我该怎么办?

【问题讨论】:

  • “清理”是什么意思,您的正则表达式似乎只是从字符串中删除 txt 或 dat 扩展名。无论如何,你应该有像String expected = "hello world"; 这样的东西来进行测试,然后是String actual = myController.covertToLowerCase(SLICE_NAME);,然后是assetEquals(expected, actual)。然后你想在其他不同的输入上以同样的方式测试它,比如:“test.txt”、“test.dat”、“test.doc”、“”、...
  • 我不明白。为什么要将返回值赋给一个名为expected 的变量?那应该是actualexpected 是您真正期望它返回的内容。
  • 测试中初始化的字段myController在哪里?如果函数/方法是static,则无需初始化即可使用和测试。

标签: java unit-testing testing junit


【解决方案1】:

你要测试,首先你要准备数据来测试,输入值,期望值=>用输入值调用测试函数=>得到被测函数返回的实际值=>断言期望值实际值。这是您可以使用的list of assert function

public class MyControllerTest {

  private MyController myController;
  private final String SLICE_NAME = "Hello World";
  private final String expected = "hello world";

  @Test
  public void shouldReturnSanitizedString() throws Exception {
  String actual = myController.covertToLowerCase(SLICE_NAME);
  // assert that actual and expected are same
  assertEquals(expected, actual);
  }
}

【讨论】:

  • 如果我想测试一些其他功能: public String createSqlFromSchema(List mapSchemas) { String template = "%s %s"; List colList = mapSchemas.stream().map(m -> String.format(template, m.getColName(), m.getDataType())) .collect(Collectors.toList()); return String.join("\n", colList); } 。我必须提供什么作为测试函数中的参数?当我记录当前参数时,它显示的是参考而不是实际值。
  • @TeeJay 当您有新问题时,请提出新问题。不要进入“cmets 中的更多问题”乒乓球。另外:你觉得有人想看用cmets写的源代码吗?
  • @TeeJay 请注意@GhostCat 的评论。最重要的是你需要在使用它之前了解junit。对于您的问题,您需要测试函数createSqlFromSchema(List<MapSchema> mapSchemas),此函数的输入必须是List<MapSchema>,让我们初始化您的列表并传递给测试函数。更多的东西,你想获取一个列表的值,然后一个一个地去获取值。
【解决方案2】:

为了记录,更多“真实世界”的测试应该是这样的:

public class MyControllerTest {
  private MyController underTest = new MyController();

  @Test(expected=NullPointerException.class)
  public void testConvertToLowerCaseWithNull() {
    underTest.convertToLowerCase(null);
  } 

以上只是一个示例 - 例如,您的方法可以决定抛出 IllegalArgumentException。并且您想确保您的生产代码确实针对无效情况抛出异常。

  @Test
  public void testConvertToLowerCaseWithEmptyInput() {
    assertThat(underTest.convertToLowerCase(""), is(""));
  } 

我建议使用 assertThat()hamcrest 匹配器 - 因为生成的代码更易于阅读和理解。

然后您继续添加更多测试用例。你退后一步,提前考虑这里要测试的东西。你要确保“e”保持“e”,“E”变成“e”......等等。

这里的其他东西:

  • 尤其是在进行此类仅输入/输出的测试时 --- 请不要在您的测试方法中使用字段/常量。您希望您的测试尽可能自包含。为了理解我的测试 - 你只需要查看方法体。您的方法要求您查找这些常量实际包含的内容!
  • 准确地说:绝对没有必要在您的测试方法上设置throws Exception。它不会抛出 - 所以签名不应该宣布这一点!
  • 错误在您的生产代码中命名。您的方法不会变成小写。它还替换了内容。方法名称应该表达这一点。到目前为止,该方法名称是误导。那是你的代码能做的最糟糕的事情:误导读者相信代码做了什么,而是做更多/别的事情!

【讨论】:

    猜你喜欢
    • 2012-03-30
    • 1970-01-01
    • 2013-04-14
    • 1970-01-01
    • 2022-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多