我有以下 Java 示例类:
package main;
public class SampleClass {
private String id;
public SampleClass(String id) throws IllegalArgumentException {
validation(id);
this.id = id;
}
public void validation(String inputId) throws IllegalArgumentException {
if (inputId.length() != 6) {
throw new IllegalArgumentException("Invalid length");
}
}
}
现在,我正在尝试使用 JUnit4 测试来测试代码,如下所示:
package main;
import org.junit.rules.ExpectedException;
public class Test {
@org.junit.Rule
public ExpectedException thrown = ExpectedException.none();
@org.junit.Test
public void normalTest() {
SampleClass sample = new SampleClass("123456");
}
@org.junit.Test(expected = IllegalArgumentException.class)
public void lengthTestOriginal() {
SampleClass sample = new SampleClass("1234567");
}
@org.junit.Test
public void lengthTestVersion1() {
thrown.expect(IllegalArgumentException.class);
thrown.expectMessage("Invalid length");
SampleClass sample = new SampleClass("12345");
}
@org.junit.Test
public void lengthTestVersion2() {
try {
SampleClass puerto2 = new SampleClass("1234567");
} catch (IllegalArgumentException e) {
org.junit.Assert.assertEquals("Invalid length", e.getMessage());
}
}
}
但是,当我运行具有覆盖范围的 JUnit 测试时,必须引发异常的
SampleClass()
实例化似乎没有被覆盖,如图所示:
我知道该工具可能无法检测到所覆盖的代码,正如here所讨论的那样,但是,有什么方法可以编写测试以使它们显示为已覆盖吗?正如您所看到的,我尝试了几种替代方法来执行相同的测试,但所有这些方法都未能包含在同一实例化行中。
public class SampleClassTest {
@Test(expected = IllegalArgumentException.class)
public void testWhenExpectedLengthIsGreaterThan6_thenShouldThrowIllegalArgumentException() {
final SampleClass sample = new SampleClass("1234567");
sample.validation("invalid length");
}
}