例如,在以下代码的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");
}
答案 0 :(得分:4)
在JUnit测试中,您应该使用assertEquals()
之类的断言来验证方法调用的结果或对象的状态:
@Test
public void addingTwoNumbersShouldWork() {
int result = calculator.add(5, 7);
assertEquals(12, result);
assertFalse(calculator.hasOverflow());
}
在JUnit测试中使用try
和catch
非常罕见,除了测试代码块是否会抛出预期的异常之外的其他任何内容:
@Test
public void setColorShouldThrowNullPointerExceptionOnNullInput() {
try {
deathRay.setColor(null);
fail("expected NullPointerException");
} catch (NullPointerException expected) {
assertThat(expected.getMessage(), contains("death ray color"));
}
}
如果您正在测试的方法恰好抛出异常,则无需使用try
和catch
:
@Test
public void fireDeathRay() throws DeathRayException {
deathRay.fire();
}
在上面的测试中,如果fire()
抛出DeathRayException
(或运行时异常),则fireDeathRay
测试将失败。
在JUnit4中,使用try
和catch
的情况更为罕见,因为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()
这有几个好处:
@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));
}
}
}
抛出异常,则测试将失败并显示有用的堆栈跟踪methodAndWait("arg1")
抛出methodAndWait(null)
以外的其他内容,则测试将失败并显示有用的堆栈跟踪NullPointerException
没有投掷任何内容,则测试将失败并显示有用的消息如果您需要使用多个参数进行测试,可以使用methodAndWait(null)
runner:
Enclosed