2017-02-27 43 views
0

我在使用JUnit测试的fail()方法理解时遇到了一些麻烦。我在网上查了一下,从junit网站看到失败(java.lang.String消息)“对给定的消息失败了。”在JUnit测试中我看,这是下面的代码:解释这个失败()方法在这个junit测试中做了什么

@Test (expected = RuntimeException.class) 
    public void testBadCombine(){ 
     AvocadoPortion ap1 = new AvocadoPortion(amount1); 
     AvocadoPortion ap2 = new AvocadoPortion(amount2); 
     IngredientPortion ap3 = ap1.combine(ap2); 
     CrabPortion cp1= new CrabPortion(2); 

     ap1.combine(cp1); 
     fail("Expected RuntimeException to be thrown"); 
} 

能有人请解释一下(预期= RuntimeException.class)呢?

如果抛出RuntimeException,是否失败(“Expected RuntimeException to be thrown”);线没有得到执行,使JUnit测试成功?

为什么ap.1combine(cp1);线不在尝试和catch块? (当你需要使用try和catch块?)

正如你可以看到我很困惑,可以使用一些澄清

回答

1

可有人请解释一下(预计什么= RuntimeException.class )呢?

它需要测试抛出一个RuntimeException为了通过。

如果抛出RuntimeException,是否失败(“Expected RuntimeException to be thrown”);线没有得到执行,使JUnit测试成功?

没错。这在技术上是多余的,因为上面的expected元素。唯一的区别是,任何Throwable都会通过此检查,但不是前一个。

为什么ap.1combine(cp1);线不在尝试和catch块? (您什么时候需要使用try and catch块?)

Try/catch通常用于优雅处理异常情况。换句话说,如果出现问题,我们想要解决或解决问题,然后正常进行。在这里,我们采取相反的方法并传播异常而不是处理异常,所以JUnit可以知道异常被抛出。

+0

非常感谢! – etnie1031

0

你是对的,同时拥有expectedfail()是多余的。其中一个就足够了,因此是适当的。

对于大多数异常类型,你也是正确的,如果你想使用fail()而非expected,你可以使用一个try - 在try部分结束catch语句fail()。在这方面,RuntimeException是特殊的,因为它是所有未检查的例外的父例外。由于该方法中没有任何语句可以抛出任何检查异常,我们知道要么抛出未检查的异常,即RuntimeException,要么方法将调用fail()。一个或另一个,不是两个。

1

的合理选择,使该测试代码更加清晰:

A)只使用expected

@Test (expected = RuntimeException.class) 
public void testBadCombine(){ 
    AvocadoPortion ap1 = new AvocadoPortion(amount1); 
    AvocadoPortion ap2 = new AvocadoPortion(amount2); 
    IngredientPortion ap3 = ap1.combine(ap2); 
    CrabPortion cp1= new CrabPortion(2); 
    ap1.combine(cp1); 

}

B)如果需要的话,做你的例外中的某些特定的测试.. 。

@Test 
public void testBadCombine(){ 
    AvocadoPortion ap1 = new AvocadoPortion(amount1); 
    AvocadoPortion ap2 = new AvocadoPortion(amount2); 
    IngredientPortion ap3 = ap1.combine(ap2); 
    CrabPortion cp1= new CrabPortion(2); 
    try { 
    ap1.combine(cp1); 
    fail("should have thrown"); 
    } catch (TheExactExceptionYouExpect e) { 
    assertThat(e.getSomeProperty(), is(whatever)); 
    } 
} 

你宁愿选择“A)” - 你只有tu到“B”),实际上你想断言被测代码抛出的那个异常的某些属性。

+0

谢谢!非常有帮助 – etnie1031

+0

随时通过upvoting来表达你的感激之情,现在你达到了upvote特权:-) – GhostCat

+0

完成!再次感谢你 – etnie1031