gpt4 book ai didi

java - junit4 Java如何测试多行代码是否抛出异常

转载 作者:行者123 更新时间:2023-11-29 09:51:46 26 4
gpt4 key购买 nike

我正在为方法 add(T elem, int index) 编写否定测试一个类(class)的。该方法预计会抛出 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
}

测试变绿了,但我发现只要这 3 行代码中的 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 语句的单个测试方法,如 the SilverNak answer 中所示,出于可读性原因,我不推荐它。

请注意,除了您的案例之外,在其自己的方法中指定每个不同的场景是一种很好的做法,因为它使测试更具可读性,并且由于其责任更清晰和定义明确,它还使纠正失败的测试变得更简单/更容易。


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));
}

关于java - junit4 Java如何测试多行代码是否抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50085911/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com