2017-02-17 22 views
0

How to make mock to void methods with mockito에 다른 질문과 중복되는 내용입니다. 비슷한 질문들/답변들도 많지만 아무도 나를 도왔습니다. 수백 명의 개발자가 몇 가지 대답을 받아 들였기 때문에 아마 어딘가에서 틀렸고 내 문제가 어디인지 전혀 알 수 없습니다!void 메서드를 PowerMockito로 조롱하는 방법?

이것은 내 샘플 클래스이며 해당 메소드를 테스트하고 싶습니다.

final class NavigationBuilder { 

    @VisibleForTesting List<Intent> mIntentList = new ArrayList<>(5); 

    @VisibleForTesting 
    void addNextScreenBasedOnBookingStatus(final Booking booking) { 
     final ChatMsgDbAsyncHelper helper = new ChatMsgDbAsyncHelper(); 

     if (booking == null) { 
      helper.cleanAllMessages(mContext); // <= Crash here 
     } 

    } 
} 

이 내 테스트 클래스 :

@RunWith(PowerMockRunner.class) 
@PrepareForTest({ChatMsgDbAsyncHelper.class, SplashActivity.class}) 
public class NavigationBuilderTest { 

    private SplashActivity mActivity; 
    private NavigationBuilder mNavBuilder; 

    @Before 
    public void setUp() throws Exception { 

     mActivity = new SplashActivity(); 
     ISplashView view = mock(ISplashView.class); 
     PassengerStorage passengerStorage = mock(PassengerStorage.class); 

     mNavBuilder = new NavigationBuilder(mActivity, view, passengerStorage); 
    } 

    @Test 
    public void addNextScreenBasedOnBookingStatus_whenBookingIsNull() throws Exception { 
     ChatMsgDbAsyncHelper spy = PowerMockito.spy(new ChatMsgDbAsyncHelper()); 
     PowerMockito.doNothing().when(spy).cleanAllMessages(mActivity); 

     mNavBuilder.addNextScreenBasedOnBookingStatus(null); 

     assertTrue(mNavBuilder.mIntentList.isEmpty()); 
    } 
} 

테스트가 실패하고 테스트 helper.cleanAllMessages(mContext);의 내부 로직을 실행하기 때문에 이유는 NullPointerException입니다. 위의 조롱에서 내 기대는 그 논리를 수행해서는 안됩니다. 에 의한

:. 에서 java.lang.NullPointerException이 com.xxx.xxx.db.entities.ChatMessageTable (ChatMessageTable.java:23는)

그래서, 어떤 도움을 주시면 감사하겠습니다. 감사. PowerMockito.doNothing().when(spy).cleanAllMessages(mActivity);

그러나 당신이 실제로 전달하는 것은 널 : : 주어진 코드

답변

0

당신의 논리는 당신이 mActivity 객체를 전달하고 아무것도하지 않는 것입니다 mNavBuilder.addNextScreenBasedOnBookingStatus(null);

또한,이를 통과해야 테스트 클래스의 "스파이"객체를 사용하여 모의 논리를 작동 시키십시오. 당신이 뭔가를 시도 할 수 있음 -

PowerMockito.whenNew(ChatMsgDbAsyncHelper.class).withNoArguments().thenReturn(spy); 
PowerMockito.doNothing().when(spy).cleanAllMessages(mActivity); // or null, as per your requirement 

을 다음 방법에 mActivity 객체를 전달합니다

내 이해 :

나는 방법의 서명을 변경 문제가 된

mNavBuilder.addNextScreenBasedOnBookingStatus(mActivity); // or pass null, as per your requirement 
+0

감사합니다. 그래, 실제로 그 링크에서 비슷한 대답을 본 나는이 접근법을 기반으로 테스트 후 기대했던 것을 얻지 못했습니다. 나는 왜 그런지 모르지만 작동하지 않으며 나는 나의 질문에서 언급 한 비슷한 결과를 얻는다. – Hesam

0

다음과 함께 테스트하고 테스트 할 수 있습니다. 그래서이 경우 메서드 내에서 그것을 만드는 대신 ChatMsgDbAsyncHelper의 인스턴스를 메서드에 전달하고 있습니다.

@VisibleForTesting 
    void addNextScreenBasedOnBookingStatus(final Booking booking, final ChatMsgDbAsyncHelper chatMsgHelper) { 
... 
} 

및 시험 잘 지금 작동 : 귀하의 코멘트에 대한

@Test 
public void addNextScreenBasedOnBookingStatus_whenBookingIsNull() throws Exception { 
    ChatMsgDbAsyncHelper mChatMsgHelper = PowerMockito.spy(new ChatMsgDbAsyncHelper()); 
    doNothing().when(mChatMsgHelper).cleanAllMessages(any(Context.class)); 

    mNavBuilder.addNextScreenBasedOnBookingStatus(null, mChatMsgHelper); 

    assertTrue(mNavBuilder.mIntentList.isEmpty()); 
}