Ich bin neu in Android-Tests und ich versuche, eine ApplicationTestCase mit einem MockContext zu erstellen (naja, eigentlich versuche ich eine Umbenennung Mock Context). Aber ich bekomme immer einen AssertionFailedError. Hier ist meine sehr grundlegenden Code so weit:Android ApplicationTestCase mit einem MockContext
AppTests.java
package com.myProject.test;
import android.test.ApplicationTestCase;
public class AppTests extends ApplicationTestCase<MyApplication> {
public AppTests() {
super(MyApplication.class);
}
@Override
protected void setUp() throws Exception {
final RenamingMockContext mockContext = new RenamingMockContext(getContext());
setContext(mockContext);
createApplication();
}
}
MyApplication.java
package com.myProject.test;
import android.app.Application;
public class MyApplication extends Application {
public MyApplication() {
}
@Override
public void onCreate() {
super.onCreate();
}
}
RenamingMockContext.java
package com.myProject.test;
import android.content.Context;
import android.content.SharedPreferences;
import android.test.RenamingDelegatingContext;
import android.test.mock.MockContext;
public class RenamingMockContext extends RenamingDelegatingContext {
private static final String PREFIX = "test.";
public RenamingMockContext(Context context) {
super (new DelegatedMockContext(context), PREFIX);
//super(context, PREFIX);
}
private static class DelegatedMockContext extends MockContext {
private Context mDelegatedContext;
public DelegatedMockContext(Context context) {
mDelegatedContext = context;
}
@Override
public String getPackageName() {
return mDelegatedContext.getPackageName();
}
@Override
public SharedPreferences getSharedPreferences(
String name, int mode) {
return mDelegatedContext.getSharedPreferences(
PREFIX + name, mode);
}
}
}
Failure Trace:
junit.framework.AssertionFailedError
at android.test.ApplicationTestCase.setupApplication(ApplicationTestCase.java:102)
at android.test.ApplicationTestCase.createApplication(ApplicationTestCase.java:118)
at com.myApplication.test.AppTests.setUp(AppTests.java:14)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:190)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:175)
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:555)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1710)
Hinweis: Wenn ich den zweiten Aufruf von super() im Konstruktor von RenamingMockContext verwende, der auskommentiert ist (also nicht die erweiterte MockContext-Klasse verwenden), funktioniert das problemlos.
Hier ist eine Referenz UnsupportedOperationException while calling getSharedPreferences() from unit test, die nicht für mich funktioniert, und ich lese auch durch das Buch Android Application Testing Guide, die ein Beispiel genau so gibt, aber wenn ich die Quelle heruntergeladen und direkt ausgeführt es gab das gleiche Error.
Ich löste dies durch ContextWrapper erstreckt. Siehe meine Antwort hier - http://StackOverflow.com/a/19710382/201113 – barry