线程实现中 运行 方法的 JUnit 测试的优雅解决方案
Elegant solution for JUnit testing of run method in Thread implementation
我有一个从 Thread
扩展而来的 class 并且想要 JUnit 测试它。此时我不想测试线程安全,而只是检查实现逻辑是否正常。我的问题是 运行 方法无限迭代,例如:
public void run() {
while (status.isRunning()) {
// do stuff & sleep
}
}
出于测试目的,我只想迭代一次 run
方法中的逻辑。我想出的解决这个问题的最好办法是 Mockito
模拟对象,它使用静态计数器和 Answer:
的匿名实现
private static int counter = 0;
Status status = mock(Status.class);
when(status.isRunning()).thenAnswer(new Answer<Boolean>() {
public Boolean answer(InvocationOnMock invocation) throws Throwable {
if (counter == 0) {
counter++;
return Boolean.TRUE;
}
return Boolean.FALSE;
}
});
我不确定这个解决方案是否是最好的。对于如此常见的用例来说,这似乎有点啰嗦。
有人能想出更简单、更优雅的解决方案吗?
你不需要做任何神奇的事情,只需要在"thenReturn"方法中提供多个"answer",例如...
when(status.isRunning()).thenReturn(true, false);
我有一个从 Thread
扩展而来的 class 并且想要 JUnit 测试它。此时我不想测试线程安全,而只是检查实现逻辑是否正常。我的问题是 运行 方法无限迭代,例如:
public void run() {
while (status.isRunning()) {
// do stuff & sleep
}
}
出于测试目的,我只想迭代一次 run
方法中的逻辑。我想出的解决这个问题的最好办法是 Mockito
模拟对象,它使用静态计数器和 Answer:
private static int counter = 0;
Status status = mock(Status.class);
when(status.isRunning()).thenAnswer(new Answer<Boolean>() {
public Boolean answer(InvocationOnMock invocation) throws Throwable {
if (counter == 0) {
counter++;
return Boolean.TRUE;
}
return Boolean.FALSE;
}
});
我不确定这个解决方案是否是最好的。对于如此常见的用例来说,这似乎有点啰嗦。
有人能想出更简单、更优雅的解决方案吗?
你不需要做任何神奇的事情,只需要在"thenReturn"方法中提供多个"answer",例如...
when(status.isRunning()).thenReturn(true, false);