2016-11-30 1 views
0

내 코드에 TimerTask가 구현되어 있습니다. 정기적으로 응용 프로그램 논리를 수정합니다. 이제 JUnit을 사용하여이 TimerTask의 영향을 테스트하고 싶습니다. TimerTask가 매 2 초마다 실행되도록 예약되었지만 Thread.sleep을 사용하지 않고 테스트 사례를 실행해야한다고 가정 해 보겠습니다.JUnit 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를 얻는 것입니다. 이것은 구현하는 것이 좋습니다. 다른 시나리오는 대기 시간 후에 목록이 지워지고 null인지 테스트하고 확인해야한다는 것입니다.

+1

우리는 여러분의 요구가 무엇인지에 대해 더 자세한 정보가 필요하다고 생각하지만, [JMockit] (http://jmockit.org)을 살펴보고 싶다면,'Thread.sleep' 나 현재 시간을 반환하는 메서드 – ajb

답변

1

귀하의 경우 단위 테스트를 LogServiceScheduledAgent으로 구분합니다.

따라서 실제 로직 ScheduledAgent을 테스트 할 수 있습니다.

또 다른 경우는 LogService에 대한 테스트 당신이 scheduleAtFixedRate 방법은 올바른 매개 변수 호출 것을 확인해야한다는 것입니다. 이를 위해 JMockit 또는 PowerMockito과 같은 라이브러리를 사용할 수 있습니다. 아마도 당신은 모의 가능성을 얻기 위해 timer을 클래스의 필드로 만들어야 할 것입니다. 필자의 관점에서 볼 때, scheduleAtFixedRate 메서드는 TimerTask이라는 메서드를 호출하고 있다는 것을 테스트 할 필요가 없습니다.이 메서드는 JDK에서 제공되었으며 수천 명의 개발자가 이미 테스트했기 때문에 정기적으로 호출해야합니다.

관련 문제