2014-04-23 3 views
18

테스트를 거친 클래스 A이 있습니다. 일부 데이터가 조작 데이터베이스에서 검색 할 수있는 dateTime 값을 기준으로Mockito를 사용하여 메소드의 로컬 변수 모의

public class A { 
    public void methodOne(int argument) { 
     //some operations 
     methodTwo(int argument); 
     //some operations 
    } 

    private void methodTwo(int argument) { 
     DateTime dateTime = new DateTime(); 
     //use dateTime to perform some operations 
    } 
} 

그리고 다음은 A의 정의입니다. 이 데이터베이스의 경우 값은 JSON 파일을 통해 지속됩니다.

이것은 복잡합니다. 필요한 것은 dateTime을 테스트하는 동안 특정 날짜로 설정하는 것입니다. mockito를 사용하여 지역 변수의 값을 조롱 할 수있는 방법이 있습니까?

+0

[Mockito와 로컬 범위 개체의 조롱 방법] 가능한 중복 (http://stackoverflow.com/questions/6520242/mocking-methods-of-local-scope-objects-with-mockito) – zubergu

+0

다른 중 하나 이 주제에서 찾은 질문에는 추상화가 추가로있었습니다. 또한, 대다수는 조롱 된 클래스의 일부 메소드를 통해 지역 변수를 인스턴스화했습니다. – user657592

답변

18

로컬 변수를 모방 할 수 없습니다.

public class A { 
    public void methodOne(int argument) { 
    //some operations 
    methodTwo(int argument); 
    //some operations 
    } 

    private void methodTwo(int argument) { 
    DateTime dateTime = createDateTime(); 
    //use dateTime to perform some operations 
    } 

    protected DateTime createDateTime() { 
    return new DateTime(); 
    } 
} 

public class ATest { 
    @Test 
    public void testMethodOne() { 
    DateTime dt = new DateTime (/* some known parameters... */); 
    A a = Mockito.spy(new A()); 
    doReturn(dt).when(a).createDateTime(); 
    int arg = 0; // Or some meaningful value... 
    a.methodOne(arg); 
    // assert the result 
} 
+6

보호 된 createDateTime() 메서드를 작성하고 싶지 않습니다. 다른 방법이 있나요? – user657592

+0

실제로 Mockito.doReturn (dt) .when (a) .createDateTime()을 사용해야합니다. https://stackoverflow.com/questions/11620103/mockito-trying-to-spy-on-method-is-calling을 참조하십시오. -the-original-method – Alex

+1

이것은 물론 @Alex, 고맙다는 것에 대해 감사합니다! 수정 및 수정 됨. – Mureinik

2

이러한 문제를 해결하는 가장 좋은 방법은 날짜 시간의 새로운 인스턴스를 얻기 위해 사용되는 주입 Clock 서비스를 사용하는 것입니다 : 당신이 할 수있는 무엇, 그러나, protected 방법에 그것의 창조를 추출하여 spy입니다 . 이렇게하면 테스트에서 현재 시간 대신 특정 DateTime을 반환하는 mock Clock을 삽입 할 수 있습니다.

새로운 Java 8 시간 API는 이러한 목적으로 특별히 Clock class을 정의합니다.

+0

jdk1.8이 필요합니다. 맞습니까? 나는 현재 1.7에 있으며 언제든지 곧 업그레이드 할 계획이 아닙니다. – user657592

+1

아니요. 자신 만의 Clock 클래스 나 인터페이스를 정의하고 현재 시간을 가져 오기 위해'new DateTime()'대신'clock.newDateTime()'을 호출하면됩니다. –

관련 문제