2014-12-12 3 views
0

TestNG, Mockito 및 지금 PowerMockito를 사용하여 기존 코드 기반에 대한 단위 테스트를 작성하여 개인 및 정적 메서드를보다 쉽게 ​​테스트해야합니다. 현재 우리가 테스트하고있는 클래스에서 개인 void 메서드에 대한 테스트를 작성하려고하지만이를 파악할 수 없습니다. 일반적인 PowerMock API에는 replayAll(), verifyAll()expectLastCalled()이라는 메서드가 있으며 대부분의 용도에 적합합니다. PowerMockito 방법을 설명하는 좋은 문서를 찾을 수 없습니다. 이것에 대한 설명이나 통찰력이 있으면 대단히 감사하겠습니다. 테스트에PowerMockito 및 TestNG를 사용하여 개인 무효 메서드 호출을 예상하고 확인하는 방법은 무엇입니까?

방법 :

private void pVMethod(Type param) throws Exception { 

    param.setA(StaticClass.methodA().toString()); 
    param.setB(StaticClass.methodB().toString()); 

    // getMemo(String label) is in a public class in same package 
    param.setC(getMemo("memo.provider")); 
    param.setD(getMemo("memo.item")); 
     try { 
      param.setTimestamp(DataTypeFactory.newInstance().newXMLGregorianCalendar(newjava.util.GregorianCalendar())); 
     } catch (SomeException e) { 
      ... 
      throw new Exception(); 
    } 
} 

테스트 시도 : 당신이 개인 무효의 동작을 확인하려는 경우, PowerMockito에서

:

@Test(expectedExceptions = Exception.class) 
public void pVMethod() throws Exception { 
    TestClass testMock = mock(TestClass.class); 
    Exception exception = mock(Exception.class); 

    // StaticClass staticClassMock = mock(StaticClass.class); ?? 
    mockStatic(StaticClass.class); 

    // when(..) and thenReturn(..) are static imports from PowerMockito library 
    when(StaticClass.methodA()).thenReturn("stubStringA"); 
    when(StaticClass.methodB()).thenReturn("stubStringB"); 

    doThrow(exception).when(param).setTimestamp(Mockito.any(XMLGregorianCalendar.class)); 

    // Docs say method name can be inferred via reflection 
    Whitebox.invokeMethod(tested, event); 

    // this is where things are hairy. testedSpy is defined at the top level 
    verifyPrivate(testedSpy).pVMethod(testMock); 
} 
+0

약간 주제에서 벗어난에서 가져온하지만 * 왜 * 당신은 개인적인 방법을 테스트? 단위 테스트는 구현이 아니라 기능을 테스트해야합니다. – blgt

+0

관리자가 말했습니다. 나는이 규모로 테스트하는 것을 처음보고 왜 이런 일을 할 것인가,하지 않을지 모릅니다. 그러나 나는 powermock이 개인적이고 정적 인 방법/필드 등을 다룰 수없는 욕구를 만족시키기 위해 만들어 졌다고 말할 수있다. – kurofune

+0

조금 더 많은 문맥을 제공하면 도움이 될 것입니다. 사적인 방법을 테스트 할 수있는 몇 가지 합법적 인 이유가 있지만, 전체 그림이 없으면 조언을하기가 더 어렵습니다. – blgt

답변

0

좋아, 여기에 대한 답변입니다 메서드를 사용하는 경우 verifyPrivate() 메서드를 사용하지만 다음과 같이해야합니다.

verifyPrivate(tested).invoke("privateMethodName", argument); 

OP의 마지막 줄에서 누락 된 invoke 메소드 사용에주의하십시오.

참고 : 모의 개체의 void 메서드는 기본적으로 아무 것도 수행하지 않으므로 doNothing().when(mock.privateMethod()) 문을 사용할 필요가 없습니다.

예는 here