使用Mockito进行Android仪器测试

4

我的问题类似于这个。我正在为我的Android项目实现仪器测试。我想通过模拟我的委托来测试集成,以便我可以测试委托方法是否按预期调用。

我的gradle文件:

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)

有人可以帮忙解决这个问题吗?

2个回答

1
不确定为什么
MockitoAnnotations.initMocks(this);

由于崩溃的原因,最终我不得不使用。
System.setProperty("dexmaker.dexcache", InstrumentationRegistry.getTargetContext().getCacheDir().getPath());

代替。

0
@Captor
private ArgumentCaptor<Callback> CallbackArgumentCaptor;

然后在你的测试方法中,你将通过以下方式验证它是否被调用:

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

或者调用失败取决于你正在测试什么。不要忘记在@Before中添加这个。

@Before
   public void setup() {
       MockitoAnnotations.initMocks(this);
   }

谢谢回复。但是MockitoAnnotations.initMocks(this);会导致我发布的错误。 - Steven

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接