2016-06-02 5 views
0

테스트 할 클래스의 개인 메서드가 실행되는지 또는 powermockito를 사용하지 않는지 확인하고 싶습니다.Powermockito를 사용하여 개인 메서드 호출 여부 확인

내가 시험이 클래스를 가지고 있다고 가정하자 :

public class ClassToTest { 
    public boolean methodToTest() { 
     //doSomething (maybe call privateMethod or maybeNot) 
     return true; 
    } 

    //I want to know if this is called or not during the test of "methodToTest". 
    private void privateMethod() { 
     //do something 
    } 
} 

나는 "methodToTest"나는 올바른 결과를 반환하는 경우뿐만 아니라 그것이 개인 방법 "privateMethod"또는하지를 실행 여부를 확인하려면 테스트합니다. 다른 토론에서 검색 powermockito를 사용하지만 작동하지 않는이 테스트를 작성했습니다. 내가 디버거를 사용할 때

public class TestClass { 

    @Test 
    testMethodToTest(){ 
     ClassToTest instance = new ClassToTest(); 
     boolean result = instance.methodToTest(); 
     assertTrue(result, "The public method must return true"); 

     //Checks if the public method "methodToTest" called "privateMethod" during its execution. 
     PowerMockito.verifyPrivate(instance, times(1)).invoke("privateMethod"); 
    } 
} 

는 민간 방법은 테스트 중에 한 번 실행 된 경우 마지막 줄 (PowerMockito.verifyPrivate ...)를 확인하지 않는 것 대신 개인을 실행하는 것 메서드 자체. 또한 테스트 통과하지만 디버거를 사용하여 "private.methodToTest()"호출 중에 private 메서드가 실행되지 않는다고 확신합니다. 무엇이 잘못 되었나요?

+0

모의가 아닌 클래스의 실제 인스턴스를 확인하려고합니다! –

+0

나는 뭔가를 놓쳤다. 그렇게하는 올바른 방법은 무엇인가? 모의 행위를 테스트하는 것이 맞습니까? mock 객체는 테스트 할 클래스가 다른 객체와 갖는 참조를 숨기고 테스트 할 클래스의 인스턴스가 실제 객체가되어야한다고 가정했습니다. – user2572526

+0

부름을받는 이유는 무엇입니까? 모든 테스트는 공용 메서드가 올바른 작업을 수행하는지 여부를 고려해야하며 특정 개인 메서드가 호출되는지 여부는 신경 쓰지 않아야합니다. –

답변

1

PowerMockito 없이는 쉽게 할 수 있습니다. (그것은 스파이 객체의 일종이다)이 고려 :

public class TestClassToTest { 

    private boolean called = false; 

    @Test 
    public void testIfPrivateMethodCalled() throws Exception { 
     //given 
     ClassToTest classToTest = new ClassToTest() { 
      @Override 
      void privateMethod() { 
       called = true; 
      } 
     }; 

     //when 
     classToTest.methodToTest(); 

     //then 
     assertTrue(called); 
    } 
} 

이 민간 패키징 privateMethod()을 변경해야합니다 (그러나이 아무 문제가 없습니다).

그러나 테스트 구현은 나쁜 습관이며 취약한 테스트로 이어질 수 있음을 명심하십시오. 대신 결과 만 테스트해야합니다.