2017-02-17 2 views
0

Dies ist zweifelsfrei Duplikat einer anderen gleichen Frage bei How to make mock to void methods with mockito. Es gibt eine Menge ähnlicher Fragen/Antworten, aber keine hat mir geholfen. Da Hunderte von Entwicklern einige Antworten angenommen haben, bin ich wahrscheinlich irgendwo falsch und habe keine Ahnung, wo mein Problem ist!Wie man eine ungültige Methode mit PowerMockito vortäuscht?

Dies ist meine Beispielklasse und ich möchte ihre Methode testen.

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 
     } 

    } 
} 

Dies ist mein Test-Klasse:

@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()); 
    } 
} 

-Test schlägt fehl, und der Grund ist, weil NullPointerException Testlogik innerhalb von helper.cleanAllMessages(mContext); läuft. Meine Erwartung von oben ist, dass diese Logik nicht ausgeführt werden sollte.

Verursacht durch:. Java.lang.NullPointerException bei com.xxx.xxx.db.entities.ChatMessageTable (ChatMessageTable.java:23)

So würde jede Hilfe dankbar. Vielen Dank.

Antwort

0

Ihre Logik in dem gegebenen Code ist nichts zu tun, wenn Sie mActivity Objekt vorbei sind: PowerMockito.doNothing().when(spy).cleanAllMessages(mActivity);

Aber was Sie vorbei tatsächlich ist null: mNavBuilder.addNextScreenBasedOnBookingStatus(null);

Außerdem müssen Sie dies passieren "spy" -Objekt in der Testklasse, damit Ihre Scheinlogik funktioniert. Mai werden Sie so etwas wie dies versuchen -

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

und dann an die Methode, um Ihre mActivity Objekt übergeben:

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

Vielen Dank für Ihren Kommentar. Yup, ich habe tatsächlich eine ähnliche Antwort in diesem Link gesehen und nicht bekommen, was ich nach dem Testen erwartet habe, basierend auf diesem Ansatz. Ich weiß nicht warum, aber hat nicht funktioniert, und ich habe ähnliche Ergebnisse, die ich in meiner Frage erwähnt habe. – Hesam

0

Das Problem mein Verständnis :)

geändert wurde ich Signatur der Methode im Test mit folgendem und könnte es testen. In diesem Fall übergebe ich die Instanz ChatMsgDbAsyncHelper an die Methode, anstatt sie innerhalb der Methode zu erstellen.

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

und Test funktioniert jetzt:

@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()); 
} 
Verwandte Themen