在 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));
}
我有一个检查空参数的方法,如果有空参数则抛出 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));
}