web-dev-qa-db-ja.com

単体テストAndroid Studio: "not mocked"エラー

Android Studio。私はAndroid Studio 1.2 preview 2、gradle 2.2.1およびgradle plugin 1.1.0を使用しています。

ユニットテストを実行しようとすると、このエラーを回避できません。

Java.lang.RuntimeException: Method getInstrumentation in Android.test.InstrumentationTestCase not mocked

これは私のテストクラスです。

public class AppPreferencesTest extends InstrumentationTestCase {

AppPreferences preferences;

@Before
public void setUp() throws Exception {
    preferences = new AppPreferences(getInstrumentation().getTargetContext());
}

...

私のbuild.gradleで:

testCompile 'junit:junit:4.12'

これを追加してみました

testOptions { 
    unitTests.returnDefaultValues = true
}

これは http://tools.Android.com/tech-docs/unit-testing-support で行った手順で言及されていたが、修正されていないためです。

また、MockContextを作成してみました。

preferences = new AppPreferences(new MockContext());

ただし、AppPreferencesのコンストラクターはエラーを返します

public AppPreferences(Context context) {
    preferences = PreferenceManager.getDefaultSharedPreferences(
            context);
}

...

RuntimeException: Method getDefaultSharedPreferences in Android.preference.PreferenceManager not mocked.
12
Frank

Android Studioを使用して、インストルメンテーションテストを機能させることができませんでした。まだ実装をファイナライズしていると思います。エミュレータで実行する必要があるため、より高速なオプションがあります。テスト。

Jaredのヒントのおかげで、Robolectricに切り替えました。これはAndroid Studioで使いやすいです。

androidTestCompile 'junit:junit:4.12'
androidTestCompile "org.robolectric:robolectric:3.0"

そして

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.RobolectricTestRunner;
import static junit.framework.TestCase.assertEquals;

@RunWith(RobolectricTestRunner.class)
public class AppPreferencesTest {

    AppPreferences preferences;

    @Before
    public void setUp() throws Exception {
        preferences = new AppPreferences(RuntimeEnvironment.application.getApplicationContext());
    }

    @Test
    public void testIsNotificationsEnabled_Default() throws Exception {
        assertEquals(true, preferences.isNotificationsEnabled());
    }

    ...

ここでの情報は現時点では正しいようです: http://nenick-Android.blogspot.nl/2015/02/Android-studio-110-beta-4-and.html しかし、おそらくgoogleを使用してこのテーマで見つけたすべての情報は既に廃止されているため、近い将来再び廃止されます。

4
Frank

質問が更新されました。

このSharedPreferencesMockContext.Javaのソースをご覧ください: https://github.com/applicake/Beandroid/blob/master/Beanstalk%20Android%20ClientTest/src/com/applicake/beanstalkclient/test /SharedPreferencesMockContext.Java

テストは次のとおりです。 https://github.com/applicake/Beandroid/blob/master/Beanstalk%20Android%20ClientTest/src/com/applicake/beanstalkclient/test/NotificationsTests.Java

以下に、モックを作成する方法を示したスニペットを示します。

  @Override
  protected void setUp() throws Exception {

    final SharedPreferencesMockContext mockContext = new SharedPreferencesMockContext(getContext());
    MockApplication mockApplication = new MockApplication(){
      @Override
      public Context getApplicationContext() {
        Log.d("tests", "Im here");
        return mockContext;
      }
    };


    context = mockContext;
    setApplication(mockApplication);
    prefs = PreferenceManager.getDefaultSharedPreferences(context);
    prefs.edit().clear().commit();

    super.setUp();
  }

昨夜このエラーに遭遇しました。 「MockContext」を使用してみてください。

public class AppPreferencesTest extends InstrumentationTestCase {

AppPreferences preferences;
Context context;

@Before
public void setUp() throws Exception {
    context = new MockContext();
    preferences = new AppPreferences(context);
}

他の例をご覧ください: https://stackoverflow.com/a/29063736/950427

11
Jared Burrows