我正在为add(T elem, int index)
类的方法编写否定测试。该方法应该抛出IllegalArgumentException
如果index < 0 || index > size || elem == null
。我的测试如下所示:
@Rule
public ExpectedException thrown = ExpectedException.none();
@Test(expected = IllegalArgumentException.class)
public void addNegTest() {
l0.add(42, 10); // index > size
l0.add(42, -1); // index < 0
l0.add(null, 2); // elem == null
}
测试变成绿色,但是我发现这三行代码中只有1个抛出一个异常即可使测试变成绿色。因此,如果我向这样的代码中添加1行,测试仍然会变为绿色。
@Test(expected = IllegalArgumentException.class)
public void addNegTest() {
l0.add(42, 10); // index > size
l0.add(42, -1); // index < 0
l0.add(null, 2); // elem == null
l0.add(42, 0); // this is perfectly fine
}
那么,如何确保测试测试每一行是否引发一个异常而不仅仅是一个异常?
预期的异常是整个测试方法执行的范围,无论是否有其他语句不抛出异常。
因此,您应该根据可能的情况创建一种测试方法。
@Test(expected = IllegalArgumentException.class)
public void add_with_index_greater_than_size() {
l0.add(42, 10); // index > size
}
@Test(expected = IllegalArgumentException.class)
public void add_with_index_less_than_zero() {
l0.add(42, -1);
}
@Test(expected = IllegalArgumentException.class)
public void add_with_null_arg() {
l0.add(null, 10);
}
@Test
public void add() {
l0.add(42, 10);
Assert.assertEquals(42, l0.get(10));
}
尽管您仍然可以使用一个测试方法try/catch
来测试失败的场景,但该测试方法仍具有SilverNak答案中所示的数量,但出于可读性原因,我不建议您使用该测试方法。
请注意,除了您的情况外,在自己的方法中指定每个不同的场景是一种好的做法,因为它可以使测试更具可读性,并且由于其职责更加清晰且定义明确,因此也更容易/更容易纠正失败的测试。
JUnit 5改进
请注意,使用最新发行的JUnit版本,您可以使用相同的方法收集一些常见情况,而不会降低代码的可读性。
您可以收集传递给诸如以下的错误索引的无效案例:
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
...
@Test
public void add_with_index_less_than_zero_or_greater_than_size() {
Assertions.assertThrows(IllegalArgumentException.class,
() -> l0.add(42, 10));
Assertions.assertThrows(IllegalArgumentException.class,
() -> l0.add(42, -1));
}
但是我将把它放在一个单独的方法中:
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
...
@Test
public void add_with_null_arg() {
Assertions.assertThrows(IllegalArgumentException.class,
() -> l0.add(null, 10));
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句