Android Studio上的单元测试:"未模拟"错误

Fra*_*ank 13 android unit-testing android-studio

我是Android Studio新手.我使用的是Android Studio 1.2预览版2,gradle 2.2.1和gradle插件1.1.0.

在尝试运行我的单元测试时,我无法解决此错误:

java.lang.RuntimeException: Method getInstrumentation in android.test.InstrumentationTestCase not mocked
Run Code Online (Sandbox Code Playgroud)

这是我的测试类:

public class AppPreferencesTest extends InstrumentationTestCase {

AppPreferences preferences;

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

...
Run Code Online (Sandbox Code Playgroud)

在我的build.gradle中:

testCompile 'junit:junit:4.12'
Run Code Online (Sandbox Code Playgroud)

我尝试添加这个

testOptions { 
    unitTests.returnDefaultValues = true
}
Run Code Online (Sandbox Code Playgroud)

因为我在http://tools.android.com/tech-docs/unit-testing-support所遵循的步骤中提到过, 但它没有解决它.

我也试过创建一个MockContext:

preferences = new AppPreferences(new MockContext());
Run Code Online (Sandbox Code Playgroud)

但AppPreferences的构造函数比给出错误

public AppPreferences(Context context) {
    preferences = PreferenceManager.getDefaultSharedPreferences(
            context);
}
Run Code Online (Sandbox Code Playgroud)

...

RuntimeException: Method getDefaultSharedPreferences in android.preference.PreferenceManager not mocked.
Run Code Online (Sandbox Code Playgroud)

Jar*_*ows 11

我看到你已经更新了你的问题.

请看一下这个来源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();
  }
Run Code Online (Sandbox Code Playgroud)

我昨晚遇到了这个错误.尝试使用" MockContext".

public class AppPreferencesTest extends InstrumentationTestCase {

AppPreferences preferences;
Context context;

@Before
public void setUp() throws Exception {
    context = new MockContext();
    preferences = new AppPreferences(context);
}
Run Code Online (Sandbox Code Playgroud)

请在此处查看其他示例:https://stackoverflow.com/a/29063736/950427


Fra*_*ank 6

我无法使用Android Studio进行Instrumentation测试,我猜他们仍在最终确定实现.由于它需要在模拟器上运行,因此有更快的选择:常规单元测试.

感谢Jared的提示,我改用了Robolectric,这在Android Studio上很容易使用.

androidTestCompile 'junit:junit:4.12'
androidTestCompile "org.robolectric:robolectric:3.0"
Run Code Online (Sandbox Code Playgroud)

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());
    }

    ...
Run Code Online (Sandbox Code Playgroud)

这里的信息似乎是正确的:http: //nenick-android.blogspot.nl/2015/02/android-studio-110-beta-4-and.html 但是在不久的将来可能会再次弃用,正如我在谷歌上发现的所有信息一样,谷歌已经弃用了.

  • "感谢Jared的提示".然而,你给了自己信任. (21认同)