测试一个带有JUnit理论的String参数的方法

时间:2014-08-15 01:41:55

标签: java junit junit-theory

我对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理论为此编写单元测试。我想检查的边界情况是:

  • 空字符串
  • 空字符串(带空格的字符串)
  • 空字符串
  • 非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。有人可以帮我测试最后3个案例吗?

控制台o / p:

called
0
called
1

3 个答案:

答案 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

问题已解决。

有关详细信息,请参阅以下网址: