在JUnit测试用例中实际使用'fail'是什么?

时间:2010-10-06 06:22:00

标签: java unit-testing junit junit4

JUnit测试用例中“失败”的实际用途是什么?

8 个答案:

答案 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方法的方法。

您的测试用例有三种状态可以结束

  1. 通过:被测功能成功执行并返回 预期的数据
  2. 未通过:被测试的功能成功执行但是 返回的数据不符合预期
  3. 失败:该功能未成功执行且不是
  4. 意图(与期望例外的负面测试用例不同)     发生)。

    如果您正在使用eclipse,则分别用绿色,蓝色和红色标记指示三种状态。

    我对第三种情况使用失败操作。

    e.g。 :public Integer add(整数a,整数b){return new Integer(a.intValue()+ b.intValue())}

    1. 通过案例:a =新的Interger(1),b = new Integer(2),函数返回3
    2. 未通过案例:a =新的Interger(1),b = new Integer(2)且函数返回的soem值不是3
    3. 失败案例:a = null,b = null且函数抛出NullPointerException

答案 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);
}

如另一条评论所述。在完成实施之前进行测试失败听起来也是合理的。