2010-10-06 127 views

回答

93

,我认为它是有用的一些情况:

  • 标志着一个测试,是不完整的,所以它失败,并警告你,直到你可以完成它
  • 确保抛出一个异常:
try{ 
    // do stuff... 
    fail("Exception not thrown"); 
}catch(Exception e){ 
    assertTrue(e.hasSomeFlag()); 
} 

注:

由于JUnit4,有是测试一个异常被抛出一个更优雅的方式: 使用注释@Test(expected=IndexOutOfBoundsException.class)

然而,这不会,如果你的工作还想要检查异常,那么你仍然需要fail()

+2

请考虑这篇博文中关于失败vs预期注释的相对优点:http://blog.jooq.org/2016/01/20/use-junits-expected-exceptions-sparingly/ – lbalazscs 2016-02-05 22:16:59

+0

@sleske“如果你还想要检查异常,那么你仍然需要失败()“ - 不行。 ExpectedException是这样的,请参阅https://github.com/junit-team/junit4/wiki/exception-testing – kraxor 2017-11-15 12:22:53

+0

@kraxor:真的,我在写答案时不知道它(它可能甚至不是然后)。 – sleske 2017-11-15 22:39:57

6

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

类似下面的伪代码:

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

如果您没有在catch块中检查某些内容,则可以使用@ExpectedException(NullNullPointerException.class)方法注释来声明您期望有一种特殊类型的异常。 – FrVaBe 2010-11-17 08:10:07

9

可以说你是为当被测试的代码应该抛出一个异常

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

这是我如何使用失效方法的-ve流程编写测试用例。

有你的测试用例可以在

  1. 最终顺利通过三种状态:被测试函数执行成功,返回预期
  2. 不传递 数据:被测函数成功执行,但不符合预期 返回的数据
  3. 失败:该函数没有成功执行,这是不是

意为(与期望发生异常的负面测试案例不同) 发生)。

如果您使用的是eclipse,那么三种状态分别由绿色,蓝色和红色标记表示。

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

例如:public Integer add(integer a,Integer b){return new Integer(a.intValue()+ b。的intValue())}

  1. 传递情形:a =新基于整数(1)中,b =新的整数(2)和该函数返回3
  2. 不传递情形:a =新基于整数(1)中,b =新的整数(2)和函数返回比3
  3. 失败案例等SOEM值:A = NULL,b = null,并且函数抛出
+0

如果你看看JUnit的源代码,你会发现断言使用'fail()'。 – 2016-06-02 19:42:33

6

我在的情况下使用它在那里的东西一个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 
} 
+0

是的,测试前提条件很好。但是,如果您想确保'@ Before'方法成功,则最好直接在该方法中检查它。作为奖励,至少JUnit和TestNG甚至会报告来自'@ Before' /'@ After'方法的错误的不同失败,所以可以看到问题不在测试本身。 – sleske 2016-06-17 11:51:06

1

我举个例子,使用fail()表明,尚未完成(它发生)的测试;否则,他们会表现出成功。

这可能是由于我不了解NUnit中存在的某种不完整()功能。

4

简单地使用:

org.junit.Assert.fail("Exception expected"); 
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); 
} 

正如另一条评论所述。有一个测试失败,直到你可以完成实施它听起来也是合理的。