JUnit4 代码覆盖率问题,预计会出现异常

问题描述 投票:0回答:1

我有以下 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()
实例化似乎没有被覆盖,如图所示: enter image description here

我知道该工具可能无法检测到所覆盖的代码,正如here所讨论的那样,但是,有什么方法可以编写测试以使它们显示为已覆盖吗?正如您所看到的,我尝试了几种替代方法来执行相同的测试,但所有这些方法都未能包含在同一实例化行中。

java eclipse unit-testing testing junit
1个回答
0
投票
  1. 您不必编写那么多测试用例来检查是否抛出异常。单个测试用例就足够了:
public class SampleClassTest {
  @Test(expected = IllegalArgumentException.class)
  public void testWhenExpectedLengthIsGreaterThan6_thenShouldThrowIllegalArgumentException() {
    final SampleClass sample = new SampleClass("1234567");
    sample.validation("invalid length");
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.