我看到人们使用"抛出异常"在测试中,但我从来没有。我应该担心吗?我从来没有遇到任何问题。有什么区别?
@Test()
public void test() throws Exception
{
//Do something
}
或
@Test()
public void test()
{
//Do something
}
答案 0 :(得分:5)
如果您正在测试的代码抛出异常,则必须以某种方式处理它。通过声明"抛出异常"在方法签名中,或使用try-catch。
如果您在方法中调用的代码没有抛出任何异常,那么您不需要其中任何一个。如果您需要以某种方式捕获异常,编译器将通知您。
另请注意,您可以执行测试以确保抛出异常,请参阅this answer
答案 1 :(得分:3)
从功能上讲,没有区别。它只意味着如果抛出非RuntimeException,编译器不会抱怨。由于JUnit无论如何都会捕获测试方法引发的任何异常,因此它并不重要。 但是,通常认为自己捕获异常并使用JUnit的fail方法是更好的做法,在这种情况下,您不需要throws子句。
答案 2 :(得分:2)
junit会将测试标记为处于"错误状态"如果从该方法抛出异常。对于大多数用例,这与失败测试基本相同(在错误状态下完成的测试未成功的意义上)。很多测试作者都不喜欢与处理检查异常相关的麻烦(或代码丑化)。
,例如,考虑一个应该运行几个方法并断言对象的结束状态的测试:
public class SomeTest
SomeObject so;
@Before
public void setUp() {
so = new SomeObject();
}
@Test
public void TestSomeFlow() {
try {
so.init();
// must catch in order to avoid a compilation error
} catch (InitExceptionIDontCareAbout e) {
fail ("init failed");
}
try {
so.doSomething();
// must catch in order to avoid a compilation error
} catch (SomeOtherExceptionIDontCareAbout e) {
fail ("doSomething failed");
}
assertTrue ("doSomething didn't work", so.isSomethingDone());
}
}
现在考虑代码在没有异常处理的情况下看起来更干净:
public class SomeTest
SomeObject so;
@Before
public void setUp() {
so = new SomeObject();
}
// Any exception throwm will mean the test did not succeed
@Test
public void TestSomeFlow() throws Exception {
so.init();
so.doSomething();
assertTrue ("doSomething didn't work", so.isSomethingDone());
}
}