在 JUnit 4 的相同测试方法下使用多个参数测试相同异常

Testing for same exception using multiple parameters under same test method in JUnit 4

我有一个检查空参数的方法,如果有空参数则抛出 IllegalStateException

public V put(K key, V value)
{
    if (key == null || value == null) {
        throw new IllegalStateException();
    }
.....
}

在 JUnit4 中,我一直在创建三个独立的测试方法来涵盖所有可能性:put(key, null)put(null, value)put(null, null):

@Test(expected = IllegalStateException.class)
public void testPutThrowsIllegalStateException1() {
    llmm.put("A", null);
}

@Test(expected = IllegalStateException.class)
public void testPutThrowsIllegalStateException2() {
    llmm.put(null, 1);
}

@Test(expected = IllegalStateException.class)
public void testPutThrowsIllegalStateException3() {
    llmm.put(null, null);
}

它按预期工作,但问题是它相当乏味和冗长。如果我尝试像这样将它们分组在一种方法下,那么 Eclipse 会告诉我我缺少一些覆盖范围:

@Test(expected = IllegalStateException.class)
public void testPutThrowsIllegalStateException1() {
    llmm.put("A", null);
    llmm.put(null, 1);
    llmm.put(null, null);

有没有更快的方法可以将所有 3 种方法组合成 1 种测试方法?

您的唯一测试在第一行执行后立即失败,因此其他两行永远不会执行。

进行 3 次(或仅 2 次)测试就可以了。

另一种方法是避免使用 expected 属性,而是使用一个好的断言库(或自己创建这样的断言)。

例如,使用 AssertJ,您可以这样编写测试:

@Test
public void testPutThrowsIllegalStateException() {
    assertThatIllegalArgumentException().isThrownBy(() -> llmm.put("A", null));
    assertThatIllegalArgumentException().isThrownBy(() -> llmm.put(null, 1));
    assertThatIllegalArgumentException().isThrownBy(() -> llmm.put(null, null));
}