2017-12-15 6 views
0

Ich versuche, Unit-Test auf diesem Code zu tun:Mock android.os.BaseBundle ohne roboelectric

Bundle cidParam(String accountId) { 
    Bundle params = new Bundle(1); 
    params.putString(Params.CID, accountId); 

    return params; 
} 

Dies ist das Gerät zu testen:

private void mockBundle(String cid) throws Exception { 
    Bundle mBundle = PowerMockito.mock(Bundle.class); 
    PowerMockito.doNothing().when((BaseBundle)mBundle).putString(AnalyticsController.Params.CID, cid); 
} 

Es ist jedoch immer zurück:

java.lang.RuntimeException: Method putString in android.os.BaseBundle not mocked. 

Ich weiß, ich kann Roboelectric zu Spin Simulator und rufen Sie das echte Bündel. Dies verlangsamt jedoch den Komponententest. Wer weiß, wie man die Android.os.base verspottet? Vielen Dank.

+0

können Sie umgestalten, damit das 'neue Bundle (1);' in eine separate Package-Level-Methode verschoben werden kann? –

Antwort

0

Ich bekomme endlich die Antwort von meinem Freund. Der Grund dafür ist irgendwie für spöttische android-Klasse powermockito die Hauptklasse Bedarf festgelegt werden, wie auch für den Test vorbereitet:

@PrepareForTest({MainClass.class, Bundle.class}) 

Danke für die Mühe @Maciej Kowalski. Ich werde für Ihre Bemühungen stimmen, da es sowieso in die richtige Richtung geht.

1

1) In richtigen Aufbau

@RunWith(PowerMockRunner.class) 
@PrepareForTest(Bundle.class) 
public class MyTest{ 

2) Verwenden Vanille Mockito für do().when():

Bundle mBundle = PowerMockito.mock(Bundle.class); 
    Mockito.doNothing().when(mBundle).putString(AnalyticsController.Params.CID, cid); 

3) Verwenden PowerMock für whenNew():

PowerMockito.whenNew(Bundle.class) 
      .withAnyArguments().thenReturn(mBundle); 
+0

Hallo @Maciej Kowalski Vielen Dank für Ihre Hilfe. Ich habe Ihren Code eingegeben, funktioniert aber immer noch nicht. Es gibt denselben Fehler zurück. Ich bin wirklich neugierig, warum es nicht funktioniert. Warum sagt der Fehler, dass "android.os.BaseBundle nicht verspottet", welches die Elternklasse ist? Warum kann es nicht verspottet werden, weil die Bundle-Klasse endgültig ist? Lass es mich wissen, wenn du mehr Einsicht hast. Danke – surga

+0

ok, dann brauchst du PowerMock.createMock (Bundle.class); anstelle von Mockito.mock –

+0

Entschuldigung, was ist der Unterschied zwischen 'PowerMockito.mock' und' PowerMock.createMock'? – surga