2015-06-02 8 views
11

Próbujesz użyć mockito w moim AndroidTestCase. Dodałem zależności do build.gradle:NPE podczas wywoływania MockitoAnnotations.initMocks() w AndroidTestCase

final DEXMAKER_VERSION = '1.2' 

dependencies { 
    // ... 
    androidTestCompile "com.google.dexmaker:dexmaker:${DEXMAKER_VERSION}" 
    androidTestCompile "com.google.dexmaker:dexmaker-mockito:${DEXMAKER_VERSION}" 
    androidTestCompile 'org.mockito:mockito-core:1.10.19' 

} 

TestCase z inicjalizacji Mockito:

public class UsersListPresenterTest extends AndroidTestCase { 

    public void setUp() throws Exception { 
     MockitoAnnotations.initMocks(this); 
    } 

    public void testInitialize() throws Exception { 

    } 
} 

Ale jak tylko mogę dodać żadnego atrybutu do klasy, jeszcze przed dodaniem adnotacji test zacząć katastrofie:

public class UsersListPresenterTest extends AndroidTestCase { 

    String mockString; 

    public void setUp() throws Exception { 
     MockitoAnnotations.initMocks(this); 
    } 

    public void testInitialize() throws Exception { 

    } 
} 

z następującymi stacktrace

java.lang.NullPointerException: Attempt to invoke virtual method 
    'java.lang.Class java.lang.Object.getClass()' on a null object reference 
at com.google.dexmaker.mockito.DexmakerMockMaker.getInvocationHandlerAdapter(DexmakerMockMaker.java:80) 
at com.google.dexmaker.mockito.DexmakerMockMaker.getHandler(DexmakerMockMaker.java:75) 
at org.mockito.internal.util.MockUtil.isMockitoMock(MockUtil.java:74) 
at org.mockito.internal.util.MockUtil.isMock(MockUtil.java:66) 
at org.mockito.internal.configuration.injection.scanner.MockScanner.isMockOrSpy(MockScanner.java:86) 
at org.mockito.internal.configuration.injection.scanner.MockScanner.preparedMock(MockScanner.java:72) 
at org.mockito.internal.configuration.injection.scanner.MockScanner.scan(MockScanner.java:61) 
at org.mockito.internal.configuration.injection.scanner.MockScanner.addPreparedMocks(MockScanner.java:47) 
at org.mockito.internal.configuration.InjectingAnnotationEngine.injectMocks(InjectingAnnotationEngine.java:96) 
at org.mockito.internal.configuration.InjectingAnnotationEngine.processInjectMocks(InjectingAnnotationEngine.java:62) 
at org.mockito.internal.configuration.InjectingAnnotationEngine.process(InjectingAnnotationEngine.java:56) 
at org.mockito.MockitoAnnotations.initMocks(MockitoAnnotations.java:108) 
at com.myproject.presentation.UsersListPresenterTest.setUp(UsersListPresenterTest.java:28) 
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:191) 
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:176) 
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:555) 
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1853) 

Co robię źle?

Odpowiedz

7

można spróbować zastąpić

MockitoAnnotations.initMocks(this); 

z tym

System.setProperty("dexmaker.dexcache", getContext().getCacheDir().getPath()); 

to działa na mnie. See ref here

+0

Jak to działa z testami JUnit 4? Nie ma 'getContext', którego można użyć. – Matthias

+1

@Matthias, używasz InstrumentationRegistry.getTargetContext(). –

+0

Dobrze, już to wymyśliłem. Dzięki. – Matthias

6

Jest to błąd w dexmaker za którą złożyli poprawkę: https://github.com/crittercism/dexmaker/pull/24

+0

czy kiedykolwiek to połączą ?! – Aggressor

+0

Ponieważ używam zmodyfikowanych zestawów źródłowych, potrzebuję zainstalować tę bibliotekę jako słoik (NIE będzie kompilacji ze stopnia), więc potrzebuję go w słoiku :( – Aggressor

+0

dshirley poprosił mnie o przejęcie projektu - Zgodziłem się, ale to nie " Tak się stało - obawiam się, że jestem bezsilny, a jeśli nic się nie stanie, stworzę widelec. –

2

Dla mnie rozwiązaniem było wykorzystanie Metoda Mockito.mock() dla każdego Mocking Object zamiast korzystania MockitoAnnotations.initMocks(this);

Tak na przykład:

public class HomePresenterTest { 
    private Repository repository; 
    private HomePresenter presenter; 

    @Before 
    public void before() { 
     repository = mock(Respository.class); 
     presenter = new HomePresenter(repository); 
    } 

    //Your tests 
}