Инструментальное тестирование Android с mockito

Мой вопрос похож на этот вопрос. Я выполняю инструментальное тестирование для своего проекта Android. Я хочу протестировать интеграцию, издевательски над моим делегатом, чтобы я мог проверить, вызываются ли методы делегата должным образом.

Мой файл градиента:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.3"

    defaultConfig {
        applicationId "com.mytest"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    repositories {
        maven { url 'http://repo1.maven.org/maven2' }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:23.4.0';
    compile 'com.android.support:design:23.4.0';

    androidTestCompile 'com.google.dexmaker:dexmaker-mockito:1.2';
    androidTestCompile 'com.google.dexmaker:dexmaker:1.2';
    androidTestCompile 'org.mockito:mockito-core:1.10.19'
    androidTestCompile 'com.android.support:support-annotations:23.4.0';
    androidTestCompile 'com.android.support.test:runner:0.5';
    androidTestCompile 'com.android.support.test:rules:0.5';
    androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2';
}

Мой тестовый файл:

public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActivity> {

    MainActivity mainActivity;

    @Mock
    MyDelegate delegate;

    public MainActivityTest() {
        super(MainActivity.class);
    }

    @Before
    public void setUp() throws Exception {
        mainActivity = getActivity();
        MockitoAnnotations.initMocks(this);
        mainActivity.setDelegate(delegate);
    }

    @Test
    public void testDelegateMethod1() throws Exception {
        mainActivity.doSomething();
        //delegate.method1 should be called
    }

}

Я получил ошибку:

java.lang.NullPointerException
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)

Может ли кто-нибудь помочь с этой проблемой?


person Steven    schedule 13.09.2016    source источник


Ответы (2)


Не уверен, почему

MockitoAnnotations.initMocks(this);

вызвать сбой, я в конечном итоге использую

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

вместо.

person Steven    schedule 20.09.2016

@Captor
private ArgumentCaptor<Callback> CallbackArgumentCaptor;

И затем в своем тестовом методе вы убедитесь, что он вызывается, выполнив следующие действия:

verify(repository).retrieveSomething(callbackArgumentCaptor.capture());
callbackArgumentCaptor.getValue().successful(); 

или сбой вызова зависит от того, что вы тестируете. Не забудьте также добавить это в @Before

@Before
   public void setup() {
       MockitoAnnotations.initMocks(this);
   }
person N Jay    schedule 13.09.2016
comment
Спасибо за повтор. Но MockitoAnnotations.initMocks(this); вызовет ошибку, которую я разместил - person Steven; 14.09.2016