Android Studio上的unit testing:“没有嘲笑”的错误

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

我无法绕过这个错误,当试图运行我的unit testing

java.lang.RuntimeException: Method getInstrumentation in android.test.InstrumentationTestCase not mocked 

这是我的testing课:

 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跟踪的步骤中提到的,但它不能解决它。

我也尝试创build一个MockContext:

 preferences = new AppPreferences(new MockContext()); 

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

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

 RuntimeException: Method getDefaultSharedPreferences in android.preference.PreferenceManager not mocked. 

Solutions Collecting From Web of "Android Studio上的unit testing:“没有嘲笑”的错误"

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

请看这个SharedPreferencesMockContext.java的源代码: https : //github.com/applicake/Beandroid/blob/master/Beanstalk%20Android%20ClientTest/src/com/applicake/beanstalkclient/test/SharedPreferencesMockContext.java 。

这是testing: https : //github.com/applicake/Beandroid/blob/master/Beanstalk%20Android%20ClientTest/src/com/applicake/beanstalkclient/test/NotificationsTests.java

这是一个片段显示他们如何创build他们的模拟:

  @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

我无法使用Android Studio进行Instrumentationtesting,我想他们仍然在最终确定实施。 由于需要在模拟器上运行,所以有更快的select:常规的unit testing。

感谢Jared的提示,我转而使用Android Studio上的Robolectric。

 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但可能会在不久的将来贬值,因为我在这个主题上使用谷歌已经不赞成使用的所有信息。