2012-02-03 1 views
4

JUnit 테스트를 작성 중이며 Mockito도 사용하고 있습니다. 메소드를 호출하여 두 번째 메소드를 호출합니다. 타임스. 나는 두 번째 방법이 내 단위 테스트 중에 호출되는 것을 원하지 않지만, 그것이 무엇이 었는지를 알고 싶다.유닛 테스트 중에 메서드 호출이 시도되었지만 실제로 호출하지 않는다는 것을 모의합니다.

public class MyClass { 
    public void myMethod() { 
     int a = [do some logic] 
     int b = [do some logic]; 
     doSomething(a, b); 

     a = [do some logic]; 
     b = [do some logic]; 
     doSomething(a, b); 
    } 

    public void doSomething(int a, int b) { 
     // code that I do not want to be executed during a unit test 
    } 
} 

이제 단위 테스트 :

@Test 
public void test() { 
    MyClass myClass = new MyClass(); 
    myClass.myMethod(); 
    verify(myClass).doSomething(17, 33); 
    verify(myClass).doSomething(9, 18); 
} 

내가 Mockito에 새로운 오전 중 A) 해봐요을 방지하는 것이 가능하다면 나도 몰라 테스트 할 내 코드는 다음과 같이 보입니다()가 실행되지 않고 B) & b 인수의 값을 확인하십시오. 나는 "Mockito가 당신을 도울 수 없다"또는 "기술적으로 가능한 것이 아닙니다"와 같은 대답을 기꺼이 받아 들일 것입니다. 이런 종류의 것을 조롱하는 방법이 없다면, 직접적으로 테스트 할 수있는 메소드로 리팩토링하는 것을 고려해 볼 수도 있지만,이 간단한 예제보다 코드가 복잡하고 온라인으로 코드를 게시 할 수 없습니다. .

+0

당신은 유용이 질문에 대한 답을 찾을 수 있습니다 에 http : // 유래. com/questions/1087339/using-mockito-to-test-abstract-classes – tjdett

답변

5

스파이가 추합니다. 테스트 중 클래스를 부분적으로 모의 해본다면 조롱받는 것과 실제 테스트 된 것에 대해 쉽게 혼동을 느낄 수 있습니다. Mockito의 Javadoc은 부분적 조롱에 대해 명시 적으로 경고합니다.

코드를 리팩토링하여 코드를 깔끔하게 테스트하는 것이 좋습니다. 새로운 클래스로 doSomething()의 압축을 풉니 다

public class SomethingDoer { 
    public void doSomething(int a, int b) { 
     // code that you do not want to be executed during a unit test 
    } 
} 

변경된 MyClass의를 :

public class MyClass { 
    private final SomethingDoer somethingDoer; 

    public MyClass(SomethingDoer somethingDoer) { 
     this.somethingDoer = somethingDoer; 
    } 

    public void myMethod() { 
     int a = [do some logic] 
     int b = [do some logic]; 
     somethingDoer.doSomething(a, b); 

     a = [do some logic]; 
     b = [do some logic]; 
     somethingDoer.doSomething(a, b); 
    } 
} 

테스트 :

@Test 
public void test() { 
    SomethingDoer somethingDoer = mock(SomethingDoer.class); 
    MyClass myClass = new MyClass(somethingDoer); 
    myClass.myMethod(); 
    verify(somethingDoer).doSomething(17, 33); 
    verify(somethingDoer).doSomething(9, 18); 
} 
+0

+1 : 나는 부분적인 조롱을하는 방법을 대략 알게되어 기뻤지 만, 좋은 조언이 아닙니다. –

+0

어쨌든 다른 이유로 오늘 doSomething()을 새로운 클래스로 리팩터링해야했습니다. 당연히이 솔루션이 제가 함께 간 해결책 이었지만 두 가지 모두에 대한 관점을 얻는 것이 좋았습니다. –

5

이렇게하려면 Mockito partial mock이 필요합니다.

이 검증되지 않은,하지만 난 당신의 라인을 따라 뭔가있을 싶은 생각 : 당신은 몇 가지 방법을 대체하고 진짜 방법을 사용할 수 있도록,

@Test 
public void test() { 
    MyClass myClass = spy(new MyClass()); 
    doNothing().when(myClass).doSomething(any(Integer.class), any(Integer.class)); 
    myClass.myMethod(); 
    verify(myClass).doSomething(17, 33); 
    verify(myClass).doSomething(9, 18); 
} 

spy 세트까지 부분 모의. doNothingdoSomething (흥미로운 명명 우연의 일치)을 사용하여 실제 코드를 호출하는 대신 아무것도하지 않습니다.

+0

성공 사례! 그러나 나는 잠시 동안 NullPointerException을 얻었으며, 그것을 근절하기 위해 애쓰는 동안 스파이와 스터 빙에 대해 많은 것을 배웠다. 모든 것 중에서 NPE는'any (Integer.class) '에 의해 발생했습니다. 'Mockito.anyInt()'로 바꿔야 만했다. 기묘한. 고맙습니다! –