如何在JUnit 4中为同一个异常实现多个测试用例

时间:2014-12-21 15:35:25

标签: java testing junit

我正在JUnit 4中实现一些测试,我不知道为同一个异常编写多个测试代码。

例如,当期望的输出是一个浮点数我用输入和预期结果初始化数组时,然后我填充结果'数组,最后我使用assertArrayEquals()。它看起来像这样:

@Test
public void testing() throws Exception {
    float[] inputs = {10.24f,20.23f};
    float[] expectedResults = {10.2f,20.2f};
    float[] results = new float[inputs.length];


    for (int i=0;i<inputs.length;i++) {
        results[i]=methodBeingTested(inputs[i]);
    }

    assertArrayEquals(expectedResults, results);

}

我想这样做但是例外。 必须有一种比为期望Exception的每个测试用例创建方法更好的方法。 有人可以开导我吗?

2 个答案:

答案 0 :(得分:2)

当方法失败时,我会将mathod成功的案例分开。以下示例使用catch-exceptionzohhakassertj

import static com.googlecode.catchexception.CatchException.caughtException;
import static com.googlecode.catchexception.CatchException.verifyException;
import static org.assertj.core.api.Assertions.assertThat;

import org.junit.runner.RunWith;

import com.googlecode.zohhak.api.TestWith;
import com.googlecode.zohhak.api.runners.ZohhakRunner;

@RunWith(ZohhakRunner.class)
public class MyTest {

    @TestWith({
        "10.5",
        "-2.8"
    })
    public void should_throw_exception(float input) {
        verifyException(new ObjectUnderTest()).methodBeingTested(input);

        assertThat(caughtException())
                    .isInstanceOf(IllegalArgumentException.class);
    }

    @TestWith({
        "10.24, 10.2",
        "20.23, 20.2"
    })
    public void should_succeed(float input, float expectedOutput) {
        assertThat(methodBeingTested(input)).isEqualTo(expectedOutput);
    }
}

答案 1 :(得分:0)

使用JUnit4,您可以告诉框架,测试方法需要使用以下语法的异常:

@Test(expected = Exception.class)
public void test() {}

只需将Exception.class替换为您希望在测试中抛出的异常类型。

在您的测试方法中,您还可以捕获异常并在catch块中添加断言。

int exceptionThrown = inputs.length;
for (int i=0;i<inputs.length;i++) {
  try {
    // code that should throw an exception
  } catch (SomeException e) {
    assert.assertTrue(e instanceof SomeException)
    exceptionThrown--;
  }
}
assert.AssertEquals(exceptionThrown, 0);

但是如果某个数组应该抛出一个异常,我认为更好的方法就是将那些通过w / o异常的方法与那些在单独方法中抛出异常方法的方法分开,以使事情更清晰,更具可读性。