Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用JUnit理论测试接受字符串参数的方法_Java_Junit_Junit Theory - Fatal编程技术网

Java 使用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个 以下是我目前掌握的情况:

我对JUnit理论非常陌生。我有一个parse()方法,它接受一个html字符串作为输入并返回一个文档(html文档的DOM)

我想用Junit理论为此编写单元测试。我要检查的边界情况是:

  • 空字符串
  • 空白字符串(带空格的字符串)
  • 空字符串
  • 非Html字符串
  • 有效的HTML字符串
对于前3个,它应该抛出一个IllegalArgumentException。对于最后2个,它返回一个有效的文档对象。 我已经能够编写前2个测试。但我不确定如何使用Junit理论测试最后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

当您使用@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){...}