gpt4 book ai didi

java - 如何使用 ExpectedException 规则在一个测试中测试多个异常?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:25:34 29 4
gpt4 key购买 nike

有一个关于 junit 的 ExpectedException 规则的使用的问题:

如此处所建议:junit ExpectedException Rule从 junit 4.7 开始,可以像这样测试异常(这比 @Test(expected=Exception.class) 好得多):

@Rule
public ExpectedException exception = ExpectedException.none();

@Test
public void testFailuresOfClass() {
Foo foo = new Foo();
exception.expect(Exception.class);
foo.doStuff();
}

现在我需要在一个测试方法中测试多个异常,并在运行以下测试后得到一个绿色条,因此认为每个测试都通过了。

@Test
public void testFailuresOfClass() {
Foo foo = new Foo();

exception.expect(IndexOutOfBoundsException.class);
foo.doStuff();

//this is not tested anymore and if the first passes everything looks fine
exception.expect(NullPointerException.class);
foo.doStuff(null);

exception.expect(MyOwnException.class);
foo.doStuff(null,"");

exception.expect(DomainException.class);
foo.doOtherStuff();
}

但是过了一会儿我意识到测试方法在第一次检查通过后就退出了。这至少可以说是模棱两可的。在 junit 3 中,这很容易实现......所以这是我的问题:

如何使用 ExpectedException 规则在一个测试中测试多个异常?

最佳答案

简短的回答:你不能。

如果对 foo.doStuff() 的第一次调用抛出异常,您将永远无法到达 foo.doStuff(null)。您必须将测试分成几个部分(对于这种微不足道的情况,我建议回到简单的表示法,不使用 ExpectedException):

private Foo foo;

@Before
public void setUp() {
foo = new Foo();
}

@Test(expected = IndexOutOfBoundsException.class)
public void noArgsShouldFail() {
foo.doStuff();
}

@Test(expected = NullPointerException.class)
public void nullArgShouldFail() {
foo.doStuff(null);
}

@Test(expected = MyOwnException.class)
public void nullAndEmptyStringShouldFail() {
foo.doStuff(null,"");
}

@Test(expected = DomainException.class)
public void doOtherStuffShouldFail() {
foo.doOtherStuff();
}

如果你真的想要一个而且只有一个测试,如果没有抛出错误,你可以失败,并捕获你期望的东西:

@Test
public void testFailuresOfClass() {
Foo foo = new Foo();

try {
foo.doStuff();
fail("doStuff() should not have succeeded");
} catch (IndexOutOfBoundsException expected) {
// This is what we want.
}
try {
foo.doStuff(null);
fail("doStuff(null) should not have succeeded");
} catch (NullPointerException expected) {
// This is what we want.
}
// etc for other failure modes
}

不过,这很快就会变得非常困惑,如果第一个预期失败,您将看不到其他任何东西是否也失败,这在进行故障排除时可能会很烦人。

关于java - 如何使用 ExpectedException 规则在一个测试中测试多个异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17722020/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com