【发布时间】:2018-10-19 09:36:55
【问题描述】:
我正在尝试测试下一个方法:
public void methodToTest() {
// Other stuff
privateMethod(false).execute(new Void[0]);
}
调用的是privateMethod:
private AsyncTask<Void, Void, CustomObject> privateMethod(final boolean renew) {
AsyncTask<Void, Void, CustomObject> asyncTask = new AsyncTask<Void, Void, CustomObject>() {
@Override
protected CustomObject doInBackground(Void... params) {
CustomObject custom = new CustomObject();
return custom;
}
protected void onPostExecute(CustomObject custom) {
//some code
}
};
asyncTask 的执行不能在使用 Mockito 的测试中完成,所以我需要以某种方式模拟它。我试过用 PowerMock 模拟私有方法:
@Mock Context mockContext;
@Mock AsyncTask<Void, Void, CustomObject> mockAsyncTask;
@Test
public void methodTest() {
ClassToTest objectToTest = new ClassToTest(mockContext);
try {
PowerMockito.doReturn(mockAsyncTask).when(objectToTest, "privateMethod", ArgumentMatchers.anyBoolean());
objectToTest.methodToTest();
} catch (Exception e) {
e.printStackTrace();
}
}
这在 PowerMockito 行 (NullPointerException) 中给了我一个例外,说
方法抛出“org.mockito.exceptions.misusing.UnfinishedStubbingException”异常。无法评估 android.os.AsyncTask$MockitoMock$1952591544.toString()
现在我已经没有关于如何模拟这个对象的想法了。
【问题讨论】:
-
您的代码设置方式使单元测试变得困难。我认为您应该将执行 asynctask 的任务分成其他方法并成为您测试的任务。
-
你不应该模拟私有方法,而是 service/... 调用
-
@Stultuske 是的,但是如果我不模拟该方法,我该如何解决这种情况?我知道这不是最好的方法,但我找不到其他方法。
-
@Stultuske 重构!
标签: java android unit-testing mockito powermockito