2011-03-10 5 views
2

현재 JRE 1.4 (Java 런타임 환경) 만 사용하고 있으며 현재 시간을 계산하는 클래스가 있습니다. 나는 클래스를 단위 테스트하려고하지만 JRE1.4에서 지원하지 않는 주석을 필요로하는 모든 조롱 도구가 상당히 어려워 보인다.JRE 1.4로 현재 시간 조롱

JRE 1.4 친숙한 버전의 mockito를 사용해 보았지만 정적 클래스를 조롱하는 것을 허용하지 않았습니다. Jmockit에는 다운로드 할 수있는 아주 쉬운 해결책이 있지만 Jmockit의 JRE1.4 친숙한 버전 인 것 같지 않습니다.

JRE1.5 이상을 사용하는 경우 두 가지 방법이 있습니다. 현재 시간을 요구하거나 현재 시스템 시간을 조롱하는 방법).하지만 슬프게도 나는 그렇지 않습니다.

유일한 해결책은 현재 시스템 시간을 +/- 일/월/년의 메서드로 전달하는 것입니다.

그러나 가능한 경우 JRE 1.4 환경에서 조롱하는 방법을 사용하고 싶습니다.

감사합니다.

답변

0

정적 메서드를 처리 할 때 래퍼를 사용하는 것이 좋습니다. 당신이 다른 클래스의 현재 시간을 얻을해야 할 때

public class TimeWrapper() { 
    public long getCurrentTimeInMillis() { 
     return System.currentTimeMillis(); 
    } 
} 

에서, TimeWrapper 주입 : 귀하의 경우 예를 들어, TimeWrapper를 사용할 수 있습니다. 이 솔루션은 조롱 프레임 워크 및 JDK에 의존하지 않습니다.

+0

글쎄, 나는 단지 클래스를 테스트하고 내부 코드를 변경하지 않는다는 것을 잊어 버렸다. 내가 전에 시도한 것은 현재 시간을 호출하고 필요할 때 주입하는 메소드의 서브 클래스 였지만 여전히 원래의 메소드를 호출합니다. – yoshi594

+0

나는 본다. 코드를 바꿀 수 없다면 @ UWe의 해결책으로 시도해보십시오. 다른 한편으로 조롱하는 프레임 워크를 혼합하는 것은 현명하지 않습니다 (하나의 이유는 테스트 코드를 읽고 유지하는 데 다른 JUnitRunners를 사용할 수 있기 때문입니다). 그래서 당신이 easymock을 결정하고 함께 간다면, 오래된 테스트 케이스. – Zsolt

+0

네, 쉽게 모의 사용을 시도 할 것입니다.내가 성공했는지 알 수있게 해줄 것입니다.) – yoshi594

0

easymock에는 주석이 필요하지 않으므로 1.4와 호환됩니다.

+0

건배, 이걸 시도해보고 어떻게되는지 알려주겠습니다. – yoshi594

0

또는 DateHelper 과 같은 모든 시간 관련 메소드에 특수 클래스를 사용하십시오. 그런 다음 UnitTests에서 이것을 모의 처리하고 정적 변수를 통해 시간을 변경할 수 있습니다.

1

Zsolt의 솔루션 (래퍼 생성) 외에도 다른 방법으로 메서드 호출을 추출한 다음 해당 메서드를 재정의하는 하위 클래스를 테스트하는 방법도 있습니다.

class ATest{ 
    public void testStuff(){ 
     // actual test 
    } 

    class MyA extends A { 
     long currentTime; 

     protected long now(){ 
      return currentTime; 
     } 
    } 
} 

내가 래퍼 접근 방식을 선호하지만, 서브 클래스는 어떤 경우에 유용 할 수 있습니다

class A{ 
    protected long now(){ 
     return System.currentTimeMillis(); 
    } 
} 

단위 테스트 :

코드를 테스트 할 수 있습니다.

+0

@ yoshi594 광산을 작성한 후 Zsolt의 답변에 대한 의견을 읽었습니다. 코드를 변경할 수 없으므로이 솔루션도 작동하지 않습니다. 죄송합니다. – JoaoHornburg

2

Java 5를 테스트 코드로만 사용하지 않는 이유는 무엇입니까? 적절한 IDE를 사용하면 테스트 코드 (Java 5+)와 프로덕션 코드 (Java 1.4)에 대해 별도의 모듈/프로젝트를 가질 수 있어야합니다.