所以我整天都在努力让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
)。但这不应成为一个问题。应该吗?
如果这是问题,我怎么能从任何测试中分解出来?我只想测试应用程序的工作,而不是网络连接......
答案 0 :(得分:15)
答案 1 :(得分:11)
对我而言,它有助于使用最新的dexmaker(并删除所有其他powermock / mockito依赖项):
androidTestCompile 'com.linkedin.dexmaker:dexmaker-mockito:2.2.0'
答案 2 :(得分:1)
Mockito.initAnnotations
和@RunWith
彼此不兼容。他们都初始化注释。尝试删除其中一个。我建议留下跑步者。
答案 3 :(得分:0)
使用嘲笑-android代替嘲笑-核心进行工具测试。
答案 4 :(得分:-1)
对我而言,它有助于从mockito切换到powermock。将mockito降级为1.x给了我null异常,升级到2.x给了我AbstractMethodError。只需包含依赖项(而不是mockito):
testCompile "org.powermock:powermock-module-junit4:1.6.5"
testCompile "org.powermock:powermock-module-junit4-rule:1.6.5"
testCompile "org.powermock:powermock-api-mockito:1.6.5"
testCompile "org.powermock:powermock-classloading-xstream:1.6.5"