【发布时间】:2015-07-14 14:25:42
【问题描述】:
所以我整天都在努力让 Mockito 为我的 Android 项目工作。 我将所有内容添加到我的 Gradle 构建文件中:
androidTestCompile 'org.mockito:mockito-core:2.0.29-beta'
androidTestCompile "junit:junit:4.12-beta-3"
androidTestCompile 'com.google.dexmaker:dexmaker:1.2'
androidTestCompile 'com.google.dexmaker:dexmaker-mockito:1.2'
并尝试运行一个实际上并没有做任何事情的测试:
@RunWith(MockitoJUnitRunner.class)
public class LoginActivityTest extends
ActivityInstrumentationTestCase2<LoginActivity> {
private LoginActivity loginActivity;
private EditText et_email;
private EditText et_password;
private Button btn_login;
@Mock
SpiceManager manager;
public LoginActivityTest(){
super(LoginActivity.class);
}
@Override
public void setUp() throws Exception {
super.setUp();
loginActivity = getActivity();
MockitoAnnotations.initMocks(this);
//manager = mock(SpiceManager.class);
loginActivity.spiceManager = manager;
et_email = (EditText) loginActivity.findViewById(R.id.et_email);
et_password = (EditText) loginActivity.findViewById(R.id.et_password);
btn_login = (Button) loginActivity.findViewById(R.id.btn_login);
}
@Override
public void tearDown() throws Exception {
super.tearDown();
}
public void testLoginEmpty() throws Exception {
verify(manager).execute(
any(LoginRequest.class),
anyString(),
anyLong(),
any(LoginActivity.LoginRequestListener.class));
}
}
我想模拟该服务的原因是因为我想将网络部分排除在测试之外。 不需要实际发送网络请求来进行简单的测试,对吧?
无论如何,应用程序会构建,但当实际测试开始运行时,它会失败(或者更确切地说是崩溃)并显示 AbstractMethodError:
Running tests
Test running started
java.lang.AbstractMethodError: abstract method
"org.mockito.plugins.MockMaker$TypeMockability
org.mockito.plugins.MockMaker.isTypeMockable(java.lang.Class)"
at org.mockito.internal.util.MockUtil.typeMockabilityOf(MockUtil.java:26)
at org.mockito.internal.util.MockCreationValidator.validateType(MockCreationValidator.java:21)
at org.mockito.internal.creation.MockSettingsImpl.validatedSettings(MockSettingsImpl.java:167)
at org.mockito.internal.creation.MockSettingsImpl.confirm(MockSettingsImpl.java:161)
at org.mockito.internal.MockitoCore.mock(MockitoCore.java:58)
at org.mockito.Mockito.mock(Mockito.java:1410)
at org.mockito.Mockito.mock(Mockito.java:1288)
at be.sanmax.membr.activities.LoginActivityTest.setUp(LoginActivityTest.java:50)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:191)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:176)
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:555)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1837)
这让我觉得很奇怪,因为 SpiceManager 类不包含任何 abstract 方法。
然而,它是我没有编写的某些包的一部分 (com.octo.android.robospice)。但这不应该是一个问题。应该吗?
如果这是问题所在,我该如何从任何测试中排除它?我只想测试应用程序的工作,而不是网络连接...
【问题讨论】:
-
在
tests而不是androidTest中运行单元测试。尽量不要使用注释。这样做:SpiceManager manager = Mockito.mock(SpiceManager.class); -
不知道有什么不同? android studio 只允许我制作普通包或“androidTest”包。如果您查看代码 sn-p,您会看到该行已被注释掉,因为它也不起作用。
-
@SkinnyJ 与问题无关
-
@SkinnyJ 不是同样的错误,这个问题也没有解决方案。顺便说一句,我忘了把它放在问题中,但错误发生在“MockitoAnnotations.initMocks(this)”行。我可以进行“手动”模拟,但 mockito 会让我的生活变得更轻松。
-
我在使用 Mockito.mock() 调用时遇到了同样的问题。回到 mockito-core:2.0.17-beta 工作,他们在 2.0.18 版本中改变了一些东西,打破了(至少对我来说)在 Android 中的模拟。
标签: android unit-testing testing mockito