我在使用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块?)
正如你所看到的,我很困惑,可以使用一些澄清
答案 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)
你是对的,同时拥有expected
和fail()
是多余的。其中一个就够了,因此也是合适的。
对于大多数例外类型,如果您想使用fail()
而不是expected
,那么您也可以使用try
- catch
语句fail()
1}}在try
部分的末尾。在这方面,RuntimeException
是特殊的,因为它是所有未经检查的例外的父例外。由于方法中的任何语句都不能抛出任何已检查的异常,因此我们知道抛出未经检查的异常,即RuntimeException
,或者该方法将调用{{1} }}。一个或另一个,而不是两者。