JUnit测试用例中“失败”的实际用途是什么?
答案 0 :(得分:120)
我发现它有用的一些情况:
try{ // do stuff... fail("Exception not thrown"); }catch(Exception e){ assertTrue(e.hasSomeFlag()); }
注意:
从JUnit4开始,有一种更优雅的方法来测试抛出异常:
使用注释@Test(expected=IndexOutOfBoundsException.class)
但是,如果您还想检查异常,那么这将无效,那么您仍然需要fail()
。
答案 1 :(得分:11)
假设您正在编写一个-ve flow的测试用例,其中被测试的代码应引发异常
try{
bizMethod(badData);
fail(); // FAIL when no exception is thrown
} catch (BizException e) {
assert(e.errorCode == THE_ERROR_CODE_U_R_LOOKING_FOR)
}
答案 2 :(得分:8)
我认为通常的用例是在负面测试中没有抛出异常时调用它。
类似下面的伪代码:
test_addNilThrowsNullPointerException()
{
try {
foo.add(NIL); // we expect a NullPointerException here
fail("No NullPointerException"); // cause the test to fail if we reach this
} catch (NullNullPointerException e) {
// OK got the expected exception
}
}
答案 3 :(得分:7)
我已经在我的@Before方法中出现问题的情况下使用过它。
public Object obj;
@Before
public void setUp() {
// Do some set up
obj = new Object();
}
@Test
public void testObjectManipulation() {
if(obj == null) {
fail("obj should not be null");
}
// Do some other valuable testing
}
答案 4 :(得分:3)
这就是我使用Fail方法的方法。
您的测试用例有三种状态可以结束
意图(与期望例外的负面测试用例不同) 发生)。
如果您正在使用eclipse,则分别用绿色,蓝色和红色标记指示三种状态。
我对第三种情况使用失败操作。
e.g。 :public Integer add(整数a,整数b){return new Integer(a.intValue()+ b.intValue())}
答案 5 :(得分:2)
例如,我使用fail()
来表示尚未完成的测试(它发生);否则,他们会表现出成功。
这可能是因为我不知道某种不完整的()功能,它存在于NUnit中。
答案 6 :(得分:1)
在并发和/或异步设置中,您可能需要验证某些方法(例如,委托,事件侦听器,响应处理程序,您为其命名)是否未调用。除了模拟框架之外,您可以在这些方法中调用fail()
以使测试失败。在这种情况下,过期超时是另一种自然失败的情况。
例如:
final CountDownLatch latch = new CountDownLatch(1);
service.asyncCall(someParameter, new ResponseHandler<SomeType>() {
@Override
public void onSuccess(SomeType result) {
assertNotNull(result);
// Further test assertions on the result
latch.countDown();
}
@Override
public void onError(Exception e) {
fail(exception.getMessage());
latch.countDown();
}
});
if ( !latch.await(5, TimeUnit.SECONDS) ) {
fail("No response after 5s");
}
答案 7 :(得分:0)
最重要的用例可能是异常检查。
虽然junit4包含用于检查是否发生异常的expected element,但似乎它不是新的junit5的一部分。使用fail()
优于expected
的另一个好处是,您可以将其与finally
结合使用,以便进行测试用例清理。
dao.insert(obj);
try {
dao.insert(obj);
fail("No DuplicateKeyException thrown.");
} catch (DuplicateKeyException e) {
assertEquals("Error code doesn't match", 123, e.getErrorCode());
} finally {
//cleanup
dao.delete(obj);
}
如另一条评论所述。在完成实施之前进行测试失败听起来也是合理的。