我的代码中实现了TimerTask。它会定期对应用程序逻辑进行一些修改。现在我想用JUnit测试这个TimerTask的影响。假设TimerTask计划每2秒运行一次,但我应该在不使用Thread.sleep的情况下运行测试用例。
public class LogService {
public LogService() {
configuration = ConfigurationUtil.getConfgiration();
Timer timer = new Timer(true);
timer.scheduleAtFixedRate(new ScheduledAgent(), 0, configuration.getWaitTime());
}
private List<LoggingDetails> loggingDetails;
public List<LoggingDetails> getLoggers() {
return loggingDetails;
}
class ScheduledAgent extends TimerTask {
@Override
public void run() {
// if time has taken more than wait time, then clear loggingDetails
}
}
}
一个单元测试场景是我在waitTime时间段内获取loggingDetails。这可以实现。另一种情况是我应该测试并确认在等待时间之后清单并清空。
答案 0 :(得分:1)
在您的情况下,我会将LogService
和ScheduledAgent
的单元测试分开。
因此,您将实现可以测试ScheduledAgent
的实际逻辑。
另一种情况是,在LogService
的测试中,您必须检查scheduleAtFixedRate
方法是否使用正确的参数调用 。为此,您可以使用某些库,例如JMockit
或PowerMockito
。最有可能你需要将timer
作为类的一个字段来实现模拟它的可能性。从我的角度来看,您不需要测试scheduleAtFixedRate
方法是否定期调用TimerTask
,因为此方法来自JDK,并且肯定已经有数千名开发人员测试过。