Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.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_Exception_Junit - Fatal编程技术网

Java 检查junit中所有语句是否引发异常的最有效方法是什么?

Java 检查junit中所有语句是否引发异常的最有效方法是什么?,java,exception,junit,Java,Exception,Junit,我有一个函数,在给定无效输入时抛出一个ParseException,我想为它编写一个单元测试。此测试旨在确保在所有无效输入上引发异常。(对于这个问题,假设输入以[开头,以]结尾,并且没有[或]中的任何其他地方,则该输入定义为有效。) 我目前有以下测试: @Test public void invalidListFromatShouldFail() { final String[] tests = { "[[]", "[]]"

我有一个函数,在给定无效输入时抛出一个
ParseException
,我想为它编写一个单元测试。此测试旨在确保在所有无效输入上引发异常。(对于这个问题,假设输入以
[
开头,以
]
结尾,并且没有
[
]
中的任何其他地方,则该输入定义为有效。)

我目前有以下测试:

@Test
public void invalidListFromatShouldFail() {        
    final String[] tests = {
            "[[]",
            "[]]",
            "[] hi",
            "hi",
            "[h]i",
            "[hi []",
            "[[]]"
    };

    for(String toTest : tests) {
        try {
            ListUtil.parseList(toTest, TestEnum.class);
        } catch (ParseException e) {
            assertThat(e.getMessage(), startsWith(
                    "§cList format is invalid: It must start with " +
                    "'[' and end with ']', and not have any '['" + 
                    " or ']' anywhere else in it."));
            continue;
        }
        fail("Exception was not thrown for " + toTest + "!");
    }
}
这是可行的,但似乎不是正确的方法。我尝试使用,但代码仍然立即退出。(我尝试的是:

@Test
public void invalidListFromatShouldFail() throws ParseException {
    expected.expect(ParseException.class);
    expected.expectMessage(startsWith(
                    "§cList format is invalid: It must start with " +
                    "'[' and end with ']', and not have any '['" + 
                    " or ']' anywhere else in it."));

    ListUtil.parseList("[[]", TestEnum.class);
    ListUtil.parseList("[]]", TestEnum.class);
    //ECT...
}
但这只测试第一个值;如果我在最后放一个
fail()
,它仍然会成功,因为发生了异常)


我的问题是:有没有一种更优雅的方法来编写这个测试,使用还是其他一些方法?

您需要用以下注释您的测试:

@Test(expected = YourException.class)
这里有一个很好的教程:


还可以查看参数化测试:

使用JUnit参数化测试:

您也可以使用JUnitParams:


干杯,

实际上,你似乎需要两样东西。一个是编写一个测试来检查是否引发了异常,另一个是对多个输入运行相同的测试

首先,从参数化测试开始。在这种方法中,您编写的测试方法只针对单个输入运行,并且附加的代码(通常是注释)使该方法针对多个输入运行。这使代码更简单,因为您不必编写循环或将数据放入某个数组或列表中。您可以为此()使用JUnit内置的
参数化的
测试运行程序,但我个人觉得它的语法很麻烦。我的建议是让你使用它有非常简洁和甜美的语法

要检查测试单个输入的方法中是否引发了异常,可以使用
@Test
注释中的
expected
参数。另一种选择是,如果您有更长的测试,则使用更好的方法。在这里,我认为内置的已经足够好了

因此,使用JUnitParams和
expected
注释参数,您的测试可以如下所示:

@Test(expected = ParseException.class)
@Parameters(
    "[[]",
    "[]]",
    "[] hi",
    "hi",
    "[h]i",
    "[hi []",
    "[[]]"
)
public void invalidListFromatShouldFail(String input) {        
    ListUtil.parseList(toTest, TestEnum.class);
}
这是相当简短和可读性以及


EDIT:是使用
参数化
的更好示例,它还提到了
@Parameter
注释,该注释允许您直接将值注入字段,而无需在测试类中创建构造函数。尽管如此,在使用了这两种方法之后,我还是建议使用JUnit参数,而不是参数化的
,因为在易用性和测试可读性方面的差异是巨大的。

这不是我想要的。我正在尝试在多种情况下测试它。这将与使用ExpectedException做完全相同的事情,并且只检查第一个值。如果你们能像向下投票一样快速发布答案…@Pokechu22我理解,请参阅第二个链接-这就是你需要写一个完整的可用答案,在将其作为答案发布之前回答问题,你不会得到那么多的反对票。您已多次编辑此答案,但它仍然不是一个有用的答案。@Lucas第二位看起来确实有用,但此答案的主要部分没有用处。如果你可以发布一个新的答案,这将是一件好事,但目前它不是一个有用的问题的答案。同时,从无效的输入分割有效的输入。然后在您希望失败的参数化测试上使用@Test(expected=YourException.class),并尽可能保持测试的简单性。使用两个单独的@Test方法:一个在提供有效输入时测试代码的行为,另一个在提供无效输入时测试代码的行为。第一个应该是None.class,第二个应该是ParseException.class。只需确认一下,使用内置的参数化运行程序,它最终会多次运行相同的代码吗?只有一个函数需要使用这些参数多次运行。(我可能应该自己尝试一下)。用法非常相似,即:您编写一个检查单个输入的方法,而
参数化的
runner负责为不同的输入运行此方法。您不必自己编写任何循环。与JUnitParams相比,将会有更多的代码,但想法基本相同。但是,如果您想在类中有几个方法,有些是参数化的,有些不是,或者参数化的方法采用不同的参数,那么使用JUnitParams将比参数化的更方便。