如何在junit4 Java中测试多行代码是否引发异常

惠特兰

我正在为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 
}

那么,如何确保测试测试每一行是否引发一个异常而不仅仅是一个异常?

大卫xxx

预期的异常是整个测试方法执行的范围,无论是否有其他语句不抛出异常
因此,您应该根据可能的情况创建一种测试方法。

@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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Junit4中测试调用私有方法的方法

如何在Android Studio 1.1中运行简单的JUnit4测试?

如何在JUnit4中按特定顺序运行测试方法?

如何在JUnit4中使用ClassRule启动Spring Boot服务器?

如何在junit4 / testcontainers中获得@Testcontainers(disabledWithoutDocker = true)行为

如何构建可配置的JUnit4测试套件?

Eclipse中的JUnit4

使用Java Reflection Junit4测试异常

如何在JUnit5中测试引发异常?

JUnit4:测试关闭挂钩

了解失败的 JUnit4 测试?

如何测试在junit中引发并捕获了异常

Junit4在测试运行时引发异常

如何轻松模拟出Java(jUnit4)中的静态方法

如何测试带参数的方法是否在dart中引发异常?

如何测试Flutter中是否引发了异常?

如何使JUnit4“等待”以在运行测试之前完成异步作业

Tapestry:如果有@InjectComponent,如何使用JUnit4进行测试

如何通过失败的JUnit4测试使`groovy`命令退出不为零?

如何将参数从 Gradle 插件传递到 JUnit4 测试运行器?

如何创建在失败跟踪中不显示的自定义JUnit4断言

如何使用Jupiter Junit5平台的老式引擎通过gradle配置按类别运行JUnit4测试

为什么我在 JUnit4 中得到这个异常?

使用Maven在Eclipse中运行单个JUnit4测试

子类测试中的 JUnit4 NullPointerException,覆盖方法

如何在RSpec测试中引发异常

Junit4:预期=异常不适用于SPRING

类型Android Junit4不存在异常

嘲讽私有变量的函数,用于测试Junit4