2017-02-17 14 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です。上のモックからの私の期待は、それらのロジックが実行されるべきではないということです。

によって引き起こさ

:。 com.xxx.xxx.db.entities.ChatMessageTableでjava.lang.NullPointerExceptionが(ChatMessageTable.java:23)

ので、任意の助けいただければ幸いです。ありがとう。 PowerMockito.doNothing().when(spy).cleanAllMessages(mActivity);

しかし、あなたが実際に渡しているがnullである:与えられたコードで

答えて

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()); 
} 
関連する問題