简短的回答:你做不到.
如果第一次调用–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
}
但是,这很快就会变得非常混乱,如果第一个期望失败,你就不会看到其他任何事情也会失败,这在排除故障时会很烦人.