我对JUnit理论很新。我有一个方法parse(),它接受一个html字符串作为输入并返回一个Document(HTML文档的DOM)
public Document parse(final String inputString) throws IllegalArgumentException {
if (StringUtil.isBlank(inputString))
throw new IllegalArgumentException("Input HTML String is empty,blank or null");
return Jsoup.parse(inputString, "", Parser.xmlParser());
}
我想用Junit理论为此编写单元测试。我想检查的边界情况是:
如果是第3个,它应该抛出IllegalArgumentException。在最后2个的情况下,它返回一个有效的文档对象。 我已经能够为第一个2编写测试。但我不知道如何使用Junit Theories测试最后3个。
这是我到目前为止所拥有的:
@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
答案 0 :(得分:4)
所以我相信这篇文章回答了在null
中使用@DataPoints
的问题。 JUnit 4.12 issue when using theory + enum type + DataPoint that contains a null
@DataPoints
似乎不使用声明字段的类型来确定Theory
输入的类型。相反,它分析每个实际值。因此,null
未与String
相关联,而是与Object
相关联。前提是不应将null
提供给Theory
中的每个参数。
因此,您似乎无法在null
中使用@DataPoints
。正如已经指出的那样,您需要使用@DataPoint
。但是,您可以执行以下操作,而不是拥有3 @DataPoint
个值...
@DataPoints
public static String[] nonNullValues = new String[]{"", " "};
@DataPoint
public static String nullValue = null;
但是,我确实有另一个解决方案。最近我发现了@TestedOn。这允许以下内容:
@Theory
public void testIt(@TestedOn(ints={3,4,5}) int value){...}
不幸的是@TestedOn
仅针对int
实施。我实现了自己的@TestOn,允许所有原始类型。所以你的测试可以成功写成:
@Theory
public void testIt(@TestOn(strings={"", " ", TestOn.NULL}) String value){...}
这将在null
上正确测试。我真的很喜欢这种机制,因为它允许我将Theory
值映射到单个测试。
答案 1 :(得分:1)
当您使用@DataPoint而不是@DataPoints并将这三个组合分别分配给不同的字符串时,它就可以工作,即使String为null,它也会调用test()方法。
@DataPoint public static String input1 = "";
@DataPoint public static String input2 = " ";
@DataPoint public static String input3 = null;
PS:@Nemin找到了自己问题的答案。只是想把它留在这里,这样更容易找到。
PS2:如果您知道这是JUnit的错误或功能,或者是否有另一种解决方法来保存@DataPoints,请在此处分享此信息。
答案 2 :(得分:0)
尝试升级 JUnit 以发布 4.12 。
问题已解决。
有关详细信息,请参阅以下网址:
直到JUnit 4.11,@ DataPoints-annotated数组字段可以包含空值,但@ DataPoints-annotated方法返回的数组不能。这种不对称性已得到解决:两者现在都可以提供空数据点。