解释此junit测试中此fail()方法的作用

时间:2017-02-27 19:52:05

标签: java junit try-catch

我在使用JUnit测试的fail()方法时遇到了一些麻烦。我在网上看了看,从junit网站看到失败(java.lang.String message)"用给定的消息进行测试失败。"在我看的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");
}

有人可以解释(expected = RuntimeException.class)的作用吗?

如果抛出RuntimeException,则失败("抛出预期的RuntimeException"); line没有被执行,让JUnit测试成功了吗?

为什么ap.1combine(cp1);线下没有尝试和捕获块? (你什么时候需要使用try和catch块?)

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

3 个答案:

答案 0 :(得分:1)

  

有人可以解释(expected = RuntimeException.class)的作用吗?

要求测试抛出RuntimeException才能通过。

  

如果抛出RuntimeException,则失败(“抛出预期的RuntimeException”); line没有被执行,让JUnit测试成功了吗?

完全。由于上面的expected元素,这在技术上是多余的。唯一的区别是任何 Throwable都会通过此检查,而不是之前的检查。

  

为什么ap.1combine(cp1);线下没有尝试和捕获块? (你什么时候需要使用try和catch块?)

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

答案 1 :(得分: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)” - 你只想转向“B”)实际上你想要断言被测试代码抛出的异常的某些属性。

答案 2 :(得分:0)

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

对于大多数例外类型,如果您想使用fail()而不是expected,那么您也可以使用try - catch语句fail() 1}}在try部分的末尾。在这方面,RuntimeException是特殊的,因为它是所有未经检查的例外的父例外。由于方法中的任何语句都不能抛出任何已检查的异常,因此我们知道抛出未经检查的异常,即RuntimeException,或者该方法将调用{{1} }}。一个或另一个,而不是两者。