2014-10-02 2 views
3

개인적인 방법이 right-number-of-times/right-parameters라고 불리는 것을 테스트하기 위해 기대/검증을 사용할 수 있다면 조언 할 수 있습니까?Jmockit 공개 메소드 테스트시 개인 메소드 호출에 대한 기대/검증?

테스트 대상 클래스가 모의 업되었습니다. 하나의 개인 메소드가 오버라이드되었습니다.

Am 개인 메서드를 호출하는 공용 메서드를 테스트합니다.

공용 메서드가 실행될 때 호출 될 다른 개인 메서드에 대한 호출을 확인할 수 있는지 알고 싶습니다.

테스트중인 코드/클래스의 아이디어. 내 테스트 경우

public class UnderTest { 

    public void methodPublic(arg 1){ 
     ..... 
     methodPrivate1(var1); 
     .... 
     methodPrivate2(var2); 
    } 

    private void methodPrivate1(var1){ 
     //do stuff 
    } 

    private void methodPrivate2(var1){ 
     //do stuff 
    } 

} 

@Test 
public void stateBasedTestMethod() 
{ 
    UnderTest underTest; 

    new MockUp<UnderTest>() { 
     @Mock(invocations = 1) 
     private void methodPrivate2(var1) { 
      //do nothing in the mocked case 
     } 
    }; 

    underTest = new UnderTest(); 
    underTest.methodPublic(arg1); 

    new Verifications() {{ 
     // Is there a way to test that methodPrivate1 has been called-once/with-expected-arguments 
    }}; 
} 

ROGERIO의 대답에 대한 응답으로 수정 됨. jMockit 1.12 을 사용하고 있으며 제공된 솔루션을 사용하는 메소드가 JMockit 설명서에서 생각한 것처럼 메소드를 두 번 호출하므로 확인은 FAILING입니다.

오류 추적; mockit.internal.UnexpectedInvocation : 예상은 정확히 1 MyHelperTest $ 1 #의 Method3 ...의 호출 (들), 그러나이 포함

내가 이것을 사용하고있는 전체 코드는 2 회 호출되었습니다. 위에서 설명한 것처럼 내 목표는 개인적인 방법 중 하나를 조롱하여 아무 것도하지 않는 것입니다. 그리고 다른 개인 메서드가 한 번만 호출되는지 확인할 수 있는지 확인하십시오.

Jmockit으로 가능하면 미리 감사 드리며 더 나은 이해를 얻을 수 있습니다.

테스트 코드

public class MyHelperTest { 

    @Test 
    public void testHelper(@Mocked final MyDependent myDependent) { 

     final MyHelper myHelper; 

     new MockUp<MyHelper>() { 

      @Mock(invocations = 1) 
      private void method3(MyDependent myTable) { 
       System.out.println("In Mocked Method"); 
       //do nothing in the mocked case 
      } 

     }; 

     myHelper = new MyHelper(); 

     myHelper.method1(myDependent); 

     new Verifications() {{ 
      invoke(myHelper, "method2", myDependent); times = 1; 
     }}; 
    } 

} 

테스트중인 클래스.

public class MyHelper { 

    public void method1(MyDependent myDependent){ 
     method2(myDependent); 
    } 

    private void method2(MyDependent myDependent) { 
     myDependent.setValue(1); 
     method3(myDependent); 
    } 

    private void method3(MyDependent myDependent) { 
     myDependent.setValue(2); 
    } 

} 

종속 클래스

private 방법을 조롱하는 것은 권장하지 않습니다하지만 그것은, 가능
public class MyDependent { 

    private int value; 

    public int getValue() { 
     return value; 
    } 

    public void setValue(int value) { 
     this.value = value; 
    } 

} 

답변

2

.

기대 API를 사용 : invoke(...) 방법은 정적 클래스 mockit.Deencapsulation에서 수입

@Tested @Mocked MyHelper myHelper; 

@Test 
public void testHelper(@Mocked final MyDependent myDependent) 
{ 
    new NonStrictExpectations() {{ invoke(myHelper, "method3", myDependent); }}; 

    myHelper.method1(myDependent); 

    new Verifications() {{ invoke(myHelper, "method2", myDependent); times = 1; }}; 
} 

을 ....

+0

답장을 보내 주셔서 감사합니다. 제안 된 솔루션은 개인 메서드에서 호출이 발생했는지 확인하지 않습니다. "methodPrivate1"에 대한 또 다른 호출이 테스트를 통해 확인되었습니다. mockit.Deencapsulation.invoke (Object, String, Object ...) "지정된 클래스에서 지정된 인수로 액세스 할 수없는 (예 : private) 인스턴스 메서드를 호출합니다." 나는 확인하려고 노력하고있다. 공용 메서드를 테스트 할 때 개인 메서드에서 호출 (시간 및 args)을 확인할 수 있습니다. 개인 메서드 조롱에 대해서는 테스트 중에 DataBase에 씁니다. – DMac

+0

예제 테스트는 JMockit 1.12에서 작동해야합니다. 이전 버전을 사용하는 경우 테스트가 너무 단순하지 않습니다 (동일한 필드에서 @Tested + @Mocked가 새로운 기능 임). 예기치 않은 개인 메소드에 대한 호출을 점검해야합니다. –

+0

귀하의 의견에 따라 원래의 질문을 편집하십시오. 미리 감사드립니다. – DMac

0

확인하려는 메서드가 조롱되지 않는 경우 Expectations 또는 Verification 인스턴스의 정적 블록이 실행될 때 코드가 예상대로 표시하려고하거나 확인하려는 메서드를 호출하는 것으로 나타났습니다. 이것은보고있는 추가 호출을 설명합니다.

하나의 제안 : 이미 MockUp을 사용하여 클래스를 조롱하고 있으므로 익명의 하위 클래스를 만들면 개인 메서드를 재정의 할 수 있습니다. 재정의 된 개인 메서드의 액세스를 protected 또는 public으로 변경하지 않으시겠습니까? 그런 다음 기대 또는 검증을 작성할 수 있습니다.

"public int counter = 0;"공용 필드를 제공 할 수도 있습니다. 오버라이드 된 메소드가 카운터를 증가 시키도록하십시오. 그런 다음 테스트가 끝난 후에 assert를 사용할 수 있습니다.