Java 返回字符串的Junit测试函数
我在类中有一个函数:Java 返回字符串的Junit测试函数,java,unit-testing,testing,junit,Java,Unit Testing,Testing,Junit,我在类中有一个函数: public String covertToLowerCase(String sliceName) { sliceName = sliceName.trim().toLowerCase(); sliceName = sliceName.replaceAll("\\.txt$|\\.dat$", ""); return sliceName; } 我想用Junit测试一下。我创建了一个单独的测试文件,该文件包含以下内容:
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
}
我无法理解如何测试这一点,所有其他示例都是特定于其功能的。我只想让函数返回一个经过消毒的字符串?我该怎么做呢?如果要测试,首先必须准备要测试的数据,输入值,期望值=>使用输入值调用测试函数=>获取测试函数返回的实际值=>使用实际值断言期望值。这是一个你可以使用的方法
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 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()
与匹配器一起使用,因为生成的代码更易于阅读和理解
然后继续添加更多的测试用例。退后一步,你会提前考虑要测试的东西。你要确保“e”保持“e”,使“e”变成“e”。。。等等
其他事项如下:
- 尤其是在进行此类仅输入/输出测试时——不要在测试方法中使用字段/常量。您希望您的测试尽可能独立。为了理解我的测试,您只需要查看方法体。您的方法要求您查找这些常量实际包含的内容李>
- 准确一点:绝对没有必要在您的测试方法上抛出异常。它不会抛出-所以签名不应该宣布这一点李>
- 生产代码中的命名错误。你的方法不仅会变成小写。它还取代了内容。方法名称应该表示该名称。到目前为止,该方法名称具有误导性。这是你的代码所能做的最糟糕的事情:误导读者相信代码所做的事情,而是做更多的事情李>
String expected=“hello world”代码>用于测试,然后字符串实际值=myController.covertToLowerCase(SLICE\u NAME)代码>然后资产质量(预期、实际)
。然后你想用同样的方法在其他不同的输入上测试它,比如:“test.txt”、“test.dat”、“test.doc”、“我不明白”。为什么要将返回值赋给名为预期的变量?这应该是实际的
expected
是您实际期望它返回的值。myController字段在测试中初始化在哪里?如果函数/方法是静态的,则可以在不初始化的情况下使用和测试它。如果要测试其他函数: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());返回String.join(“\n”,colList);}。作为测试函数中的参数,我必须提供什么?当我记录当前参数时,它显示的是引用,而不是实际值。@TeeJay当你有新问题时,问一个新问题。不要进入“评论中的更多问题”乒乓球。此外:你认为有人想阅读注释中的源代码吗?@TeeJay请注意@GhostCat的注释。最重要的是,在使用它之前,你需要了解它。对于你的问题,你需要测试函数createSqlFromSchema(列出映射模式)
此函数的输入必须是一个列表
,让我们初始化列表并传递到测试函数。此外,您希望获取列表的值,然后逐个查看以获取值。