在 JUnit 测试用例中,‘ fault’的实际用法是什么?

在 JUnit 测试用例中,‘ fault’的实际用法是什么?

186352 次浏览

我认为通常的用例是在负测试中没有抛出异常时调用它。

类似于下面的伪代码:

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
}
}

我发现它有用的一些案例:

  • 标记一个不完整的测试,这样它就会失败并且警告你,直到你完成它
  • 确保引发异常:
try{
// do stuff...
fail("Exception not thrown");
}catch(Exception e){
assertTrue(e.hasSomeFlag());
}

注:

自 JUnit4以来,有一种更优雅的方式来测试抛出异常: 使用注释 @Test(expected=IndexOutOfBoundsException.class)

但是,如果您还想检查异常,那么这将不起作用,那么您仍然需要 fail()

假设您正在为负流编写一个测试用例,其中测试的代码应该引发一个异常。

try{
bizMethod(badData);
fail(); // FAIL when no exception is thrown
} catch (BizException e) {
assert(e.errorCode == THE_ERROR_CODE_U_R_LOOKING_FOR)
}

这就是我如何使用 Fail 方法。

您的测试用例最终可能处于以下三种状态

  1. 通过: 被测试的函数成功执行并返回 数据正如预期
  2. 未通过: 被测试的函数成功执行,但 返回的数据不如预期
  3. 失败: 函数没有成功执行,这个也没有

预期的(不像负面的测试用例期望一个异常 发生)。

如果你正在使用日食,有三种状态分别用绿色、蓝色和红色标记表示。

我将失败操作用于第三种场景。

返回 new Integer (a.intValue () + b.intValue ())}

  1. 传递案例: a = new Interger (1) ,b = new Integer (2) ,函数返回3
  2. 非传递情况: a = new Integer (1) ,b = new Integer (2) ,函数返回除3以外的一些值
  3. 失败案例: a = null,b = null,函数抛出 NullPointerException

我用它来解决我的@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
}

例如,我使用 fail()来指示尚未完成的测试(这种情况时有发生) ; 否则,它们将显示为成功。

这可能是因为我不知道 NUnit 中存在某种不完整的()功能。

最重要的用例可能是异常检查。

尽管 junit4包含用于检查是否发生异常的 预期的因素,但它似乎不是较新的 junit5的一部分。与 expected相比,使用 fail()的另一个优点是,您可以将它与 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);
}

正如在另一个评论中提到的那样,在完成实现之前让一个测试失败听起来也是合理的。

在并发和/或异步设置中,您可能需要验证某些方法(例如委托、事件侦听器、响应处理程序等)是否被 没有调用。撇开模拟框架不谈,您可以在这些方法中调用 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");
}