2016-04-07 4 views
0

Also schaue ich mir die spöttischen Objekte in einem Test an. jedoch der folgende Test wird NPE zurück, wenn „Mockito.when (mock.getName()“ einen Teil eines Codes ausgeführt wird, das ist, weil das mock-Objekt als null zurückgeführt wird.Powermock bringt mir immer wieder ein Null-Objekt zurück

package com.example.activity; 

import com.example.BuildConfig; 

import org.junit.Rule; 
import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.mockito.Mock; 
import org.mockito.Mockito; 
import org.powermock.api.mockito.PowerMockito; 
import org.powermock.core.classloader.annotations.PowerMockIgnore; 
import org.powermock.core.classloader.annotations.PrepareForTest; 
import org.powermock.modules.junit4.rule.PowerMockRule; 
import org.robolectric.Robolectric; 
import org.robolectric.RobolectricGradleTestRunner; 
import org.robolectric.annotation.Config; 

import static org.junit.Assert.assertTrue; 

@RunWith(RobolectricGradleTestRunner.class) 
@Config(constants = BuildConfig.class, sdk = 21) 
@PowerMockIgnore({ "org.mockito.*", "org.robolectric.*", "android.*" }) 
@PrepareForTest(Static.class) 
public class DeckardActivityTest { 

    @Rule 
    public PowerMockRule rule = new PowerMockRule(); 

    @Mock 
    public ToBeMocked mock; 

    @Test 
    public void testSomething() throws Exception { 
     assertTrue(Robolectric.buildActivity(DeckardActivity.class).create().get() != null); 
    } 

    @Test 
    public void testStaticMocking() { 
     PowerMockito.mockStatic(Static.class); 
     Mockito.when(Static.staticMethod()).thenReturn(mock); 
     Mockito.when(mock.getName()).thenReturn("Mock"); 
     assertTrue(Static.getResp().equals("Mock")); 
    } 
} 

und die einfache Klasse wir Tests sind

Paket com.example.activity;.

public class Static { 

    private static ToBeMocked toBeMocked; 

    public static ToBeMocked staticMethod() { 
     toBeMocked = new ToBeMocked(); 
     return toBeMocked; 
    } 

    public static String getResp(){ 
     return toBeMocked.getName(); 
    } 
} 

So muss mein Verständnis falsch sein Was Ich mag würde tun Mock aus der ToBeMocked Klasse Abhängigkeit geben und das Mock-Objekt sagen, wie zu reagieren, wenn getName Methode heißt es.

Kann jemand mir helfen, warum dies falsch oder darauf hinweisen wird, was ich

+0

Versuchen Sie, etwas für mich zu verspotten, Bewegen Sie den Mockito .when (mock.getName()). thenReturn ("Mock"); über dem thenReturn für die statische Methode. – Lencalot

Antwort

1

Ja falsch verstanden haben muss, Sie verstehen es falsch. Ich meine, du hast ein falsches Verständnis dafür, wie Mocks funktionieren.

Ihre Methode getResp (in Beispiel) verwendet interne Zustände, die werden nicht gesetzt werden, weil, nachdem Sie PowerMockito.mockStatic(Static.class); alle Anrufe von statischen Methoden der Static.class abgefangen werden rufen. Also der Code:

toBeMocked = new ToBeMocked(); 
return toBeMocked; 

wird nie aufgerufen.

Wenn die getResp die staticMethod() verwendet, dann funktioniert der Code.

public static String getResp(){ 
    return staticMethod().getName(); 
} 

So haben Sie zwei Optionen Ihr Problem zu beheben:

  • refactor Code als ich
  • Verwendung wies mock constructortoBeMocked = new ToBeMocked();
Verwandte Themen