3

我对 JUnit 理论很陌生。我有一个 parse() 方法,它接受一个 html 字符串作为输入并返回一个文档(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 理论为此编写单元测试。我要检查的边界情况是:

  • 空字符串
  • 空白字符串(带空格的字符串)
  • 空字符串
  • 非 Html 字符串
  • 有效的 HTML 字符串

如果是前 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 调用测试方法。有人可以帮我测试最后三个案例吗?

控制台输出:

called
0
called
1
4

3 回答 3

4

所以我相信这篇文章回答了关于使用nullin的问题@DataPoints使用理论 + 枚举类型 + 包含 null 的 DataPoint 时出现 JUnit 4.12 问题

似乎@DataPoints不使用声明字段的类型来确定Theory输入的类型。相反,它会分析每个实际值。因为这null不是被链接到,String而是被链接到Object。前提是null不应将其提供给 a 中的每个参数Theory

因此,您似乎无法使用nullin @DataPoints。正如已经指出的那样,您需要使用@DataPoint. @DataPoint但是,您可以执行以下操作,而不是拥有 3 个值...

@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值映射到单个测试。

于 2014-08-15T14:48:17.137 回答
1

当您使用@DataPoint 而不是@DataPoints 并分别将三个组合分配给不同的字符串时,它可以工作,并且即使字符串为空,它也会调用 test() 方法。

@DataPoint public static String input1 = "";
@DataPoint public static String input2 = " ";
@DataPoint public static String input3 = null;

PS:@Nemin 找到了他自己问题的答案。只是想把它留在这里,这样更容易找到。

PS2:如果您知道这是 JUnit 的错误还是功能,或者如果有其他方法可以解决它,请保留@DataPoints,请在此处分享此信息。

于 2014-08-15T13:53:30.260 回答
0

只需尝试将您的JUnit升级到版本4.12

问题已解决。

有关许多详细信息,请参阅以下 URL:

于 2015-03-07T23:26:21.687 回答