Java 使用JUnit理论测试接受字符串参数的方法
我对JUnit理论非常陌生。我有一个parse()方法,它接受一个html字符串作为输入并返回一个文档(html文档的DOM) 我想用Junit理论为此编写单元测试。我要检查的边界情况是:Java 使用JUnit理论测试接受字符串参数的方法,java,junit,junit-theory,Java,Junit,Junit Theory,我对JUnit理论非常陌生。我有一个parse()方法,它接受一个html字符串作为输入并返回一个文档(html文档的DOM) 我想用Junit理论为此编写单元测试。我要检查的边界情况是: 空字符串 空白字符串(带空格的字符串) 空字符串 非Html字符串 有效的HTML字符串 对于前3个,它应该抛出一个IllegalArgumentException。对于最后2个,它返回一个有效的文档对象。 我已经能够编写前2个测试。但我不确定如何使用Junit理论测试最后3个 以下是我目前掌握的情况:
- 空字符串
- 空白字符串(带空格的字符串)
- 空字符串
- 非Html字符串
- 有效的HTML字符串
@Rule
public ExpectedException thrown = ExpectedException.none();
@DataPoints
public static String[] function(){
return new String[]{
""," ",null
};
}
@Theory
public void test(String s) {
System.out.println("called");
if(s==null)
System.out.println("null");
System.out.println(s.length());
thrown.expect(IllegalArgumentException.class);
htmlAssessment.parse(s);
}
出于某种原因,没有为参数String=null调用测试方法。有人能帮我测试最后3个案例吗
控制台o/p:
called
0
called
1
当您使用@DataPoint而不是@DataPoints并分别将这三种组合分配给不同的字符串时,它会工作,并且即使字符串为null,它也会调用test()方法
@DataPoint public static String input1 = "";
@DataPoint public static String input2 = " ";
@DataPoint public static String input3 = null;
附言:@Nemin找到了他自己问题的答案。只是想把它留在这里,这样更容易找到
PS2:如果你知道这是JUnit的一个bug或功能,或者有其他方法可以解决@DataPoints,请在这里分享这些信息。所以我相信这篇文章回答了在
@DataPoints
中使用null
的问题
似乎@DataPoints
没有使用声明字段的类型来确定理论
输入的类型。相反,它分析每个实际值。因此,null
未链接到字符串
,而是链接到对象
。前提是null
不应该提供给理论中的每个参数
因此,您似乎无法在@DataPoints
中使用null
。正如已经指出的,您需要使用@DataPoint
。但是,您可以执行以下操作,而不是使用3个@DataPoint
值
@DataPoints
public static String[] nonNullValues = new String[]{"", " "};
@DataPoint
public static String nullValue = null;
然而,我有另一个解决办法。最近我发现。这考虑到以下几点:
@Theory
public void testIt(@TestedOn(ints={3,4,5}) int value){...}
不幸的是,@TestedOn
仅为int
实现。我实现了我自己的,允许所有基本类型。因此,您的测试可以成功编写为:
@Theory
public void testIt(@TestOn(strings={"", " ", TestOn.NULL}) String value){...}
这将正确测试null
。我非常喜欢这种机制,因为它允许我将理论
值映射到各个测试。只要尝试升级您的JUnit以发布4.12
问题解决了
有关许多详细信息,请参见以下URL:
- :
在JUnit4.11之前,@DataPoints注释的数组字段可以包含空值,但是@DataPoints注释的方法返回的数组不能包含空值。这种不对称性已经得到解决:现在两者都可以提供一个空数据点
控制台中正在打印什么?当s==null
时,s.length()
本身是否引发异常?不,不是。我专门添加了s.length()来测试这一点。当s==null时,它不调用test()方法。test()方法只调用了两次。我不知道为什么会发生这种情况。您是否尝试过切换参数的顺序以查看发生了什么?仅供参考,正常使用的@DataPoints
是公共静态字符串[]值=新字符串[]{“”,null}代码>不需要该方法。@请您将此问题取消标记为已回答,好吗?作为一名JUnit用户,我很想找出在DataPoints
中使用null
的答案。在我们得到答案之前,我认为这个问题仍然悬而未决。
@Theory
public void testIt(@TestOn(strings={"", " ", TestOn.NULL}) String value){...}