2017-11-21 1 views
1

매개 변수화 된 생성자를 사용하여 다른 클래스의 개체를 만드는 메서드를 테스트하고 싶습니다. MyClass의 생성자를 조롱 했음에도 불구하고 생성자 구현에있어 오류가 발생하는 타사 라이브러리를 만듭니다. 나는 Mockito/PowerMockito를 사용하고 있습니다. 내가 지금까지 시도 무엇PowerMockito를 사용하는 조롱 생성자가 작동하지 않습니다.

public class ClassTobeTested{ 

    public void execute(){ 
     //some code 
     // ...... 
     MyClass myClass = new MyClass(profile); 
     myclass.someMethod(); 
    } 
} 

을 테스트 할

public class MyClass{ 

    private MyObj obj; 

    MyClass (String profile) 
    { 
     //some 3rd party library call 
     obj = thridPartyLib.someMethod(profile);  
    } 

    public String someMethod(){ 
    return obj.someExternalCall(); 
    } 

} 

클래스 - classUnderTest.execute()은 MyClass의 생성자의 일부입니다 thridPartyLib.someMethod(profile);를 호출 끝납니다.

@RunWith(PowerMockRunner.class) 
@PrepareForTest(MyClass.class) 
public class ClassTobeTestedTest { 

    private MyClass mockMyClass; 
    private ClassTobeTested classUnderTest; 


    @Before 
    public void init() {  
     classUnderTest = new ClassTobeTested(); 
     mockMyClass = PowerMockito.mock(MyClass.class); 
    } 

    @Test 
    public void testExecute(){ 

     PowerMockito.whenNew(MyClass.class) 
       .withArguments(Mockito.any()) 
       .thenReturn(mockMyClass); 

     classUnderTest.execute();  
    } 
} 

답변

1

귀하의 코드는 classUnderTest의 스파이 또는 모의 작업을하는 경우에만 작동합니다. 이 시도. 이게 작동해야합니다

@RunWith(PowerMockRunner.class) 
@PrepareForTest({MyClass.class, ClassTobeTested.class }) 
public class ClassTobeTestedTest { 

    private MyClass mockMyClass; 
    private ClassTobeTested classUnderTest; 


    @Before 
    public void init() { 
    classUnderTest = spy(new ClassTobeTested()); 
    mockMyClass = PowerMockito.mock(MyClass.class); 
    } 

    @Test 
    public void testExecute() throws Exception { 

    PowerMockito.whenNew(MyClass.class) 
     .withArguments(Mockito.any()) 
     .thenReturn(mockMyClass); 

    classUnderTest.execute(); 
    } 
} 
+0

예. 이것은 좋은 해결책입니다. – javaPlease42

0

고통은 다른 접근 방식을 제안 할 수 있습니다. 공장을 ClassTobeTested에 주입하여 MyObj 인스턴스를 생성하는 방법을 알아보십시오. 예를 들어

class MyObjFactory { 
    MyObj create(String profile) { 
     return new MyClass(profile); 
    } 
} 

다음

public class ClassTobeTested { 
    private final MyObjFactory factory; 

    public ClassTobeTested(MyObjFactory factory) { 
     this.factory = factory; 
    } 

    public void execute(){ 
     //some code 
     // ...... 
     // MyClass myClass = new MyClass(profile); 
     MyClass myClass = factory.create(profile); 
     myclass.someMethod(); 
    } 
} 

정도로 단위 테스트는 공장을 모의 가지며 그것이 조롱 MyClass 인스턴스를 리턴 한 더 간단해진다. 그렇다면 myclass.someMethod()이 예상대로 호출되었는지 확인하는 것이 간단합니다.

관련 문제