在JUnit中,什么时候应该使用assertEquals()我应该何时使用try ... catch来验证结果?

时间:2015-07-10 01:21:43

标签: junit

例如,在以下代码的verifySthIsSetCorrectly()中,我应该使用assertEquals()来检查结果,还是应该抛出异常,以便调用者的try...catch捕获它并让调用者处理?

@Parameters
public static Collection<object[]> methodParams() {
    List<Object[]> params = new ArrayList<Object[]>();
    /* arg, errorString */
    params.add(new Object[] {"arg1", null /*errorString*/});
    params.add(new Object[] {"arg2", ERROR_STRING1 /*errorString*/});
}
@Test
public void sampleTest () {
    try {
        MethodAndWait(arg);
        assertNull("expect error String" + errorString, errorString);
    } catch (Exception ex) {
        assertNotNull("expect error String" + errorString, errorString);
        assertTrue(ex.getMessage().contains(errorString));
    }
}

private void MethodAndWait() {
    call_remote_server_to_have_sth_set;
    verifySthIsSetCorrectly();
}

private void verifySthIsSetCorrectly() {
    int sth = getSth();
    assertEquals(sth == "5");
}

3 个答案:

答案 0 :(得分:4)

在JUnit测试中,您应该使用assertEquals()之类的断言来验证方法调用的结果或对象的状态:

@Test
public void addingTwoNumbersShouldWork() {
  int result = calculator.add(5, 7);

  assertEquals(12, result);
  assertFalse(calculator.hasOverflow());
}

在JUnit测试中使用trycatch非常罕见,除了测试代码块是否会抛出预期的异常之外的其他任何内容:

@Test
public void setColorShouldThrowNullPointerExceptionOnNullInput() {
  try {
    deathRay.setColor(null);
    fail("expected NullPointerException");
  } catch (NullPointerException expected) {
    assertThat(expected.getMessage(), contains("death ray color"));
  }
}

如果您正在测试的方法恰好抛出异常,则无需使用trycatch

@Test
public void fireDeathRay() throws DeathRayException {
  deathRay.fire();
}

在上面的测试中,如果fire()抛出DeathRayException(或运行时异常),则fireDeathRay测试将失败。

在JUnit4中,使用trycatch的情况更为罕见,因为you can use the ExpectedException rule to check if a call throws an expected exception

答案 1 :(得分:1)

您的测试应该是

@Test
public void sampleTest () {
    call_remote_server_to_have_sth_set;
    int sth = getSth();
    assertEquals(5, sth);
}

如果您还没有完成它,我建议您阅读使用JUnit进行测试的介绍。

答案 2 :(得分:0)

在我的回答被接受之后,我会采取不寻常的步骤来添加另一个答案。前面的答案集中在摘要中提出的问题,但我想关注代码。

我认为你想知道该怎么做的原因之一是因为测试JourneyLeg.where(:start_station => 24) JourneyLeg.where(start_station: 24) 正在测试两个完全不同的东西。 您的测试方法是在同一测试方法中测试正常行为和异常行为。

相反,将特殊情况的测试分解为他们自己的测试方法。例如:

sampleTest()

这有几个好处:

  1. 如果@RunWith(JUnit4.class) public class SampleTest { @Test public void methodAndWaitShouldAcceptNonNullValue() { ClassUnderTest.methodAndWait("arg1") } @Test public void methodAndWaitShouldThrowWhenGivenNullValue() { try { ClassUnderTest.methodAndWait(null); fail("NullPointerException was not thrown"); } catch (NullPointerException ex) { assertTrue(ex.getMessage().contains(ERROR_STRING1)); } } } 抛出异常,则测试将失败并显示有用的堆栈跟踪
  2. 如果methodAndWait("arg1")抛出methodAndWait(null)以外的其他内容,则测试将失败并显示有用的堆栈跟踪
  3. 如果NullPointerException没有投掷任何内容,则测试将失败并显示有用的消息
  4. 两项测试的目的非常明确
  5. 如果您需要使用多个参数进行测试,可以使用methodAndWait(null) runner:

    Enclosed