使用 PowerMock 模拟私有方法
Mocking private method with PowerMock
我正在尝试测试下一个方法:
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
}
};
无法在使用 Mockito 的测试中执行 asyncTask,因此我需要以某种方式模拟它。我试过用 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) 中给了我一个异常
Method threw 'org.mockito.exceptions.misusing.UnfinishedStubbingException' exception. Cannot evaluate android.os.AsyncTask$MockitoMock52591544.toString()
现在我运行不知道如何模拟这个对象。
终于找到答案了:
@Test
public void methodTest() {
ClassToTest objectToTest = PowerMockito.spy(new ClassToTest());
try {
when(objectToTest, method(ClassToTest.class, "privateMethod", boolean.class)).withArguments(false).thenReturn(mockAsyncTask);
} catch (Exception e) {
e.printStackTrace();
}
}
并且就在 class 声明之前:
@PrepareForTest(ClassToTest.class)
我正在尝试测试下一个方法:
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
}
};
无法在使用 Mockito 的测试中执行 asyncTask,因此我需要以某种方式模拟它。我试过用 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) 中给了我一个异常
Method threw 'org.mockito.exceptions.misusing.UnfinishedStubbingException' exception. Cannot evaluate android.os.AsyncTask$MockitoMock52591544.toString()
现在我运行不知道如何模拟这个对象。
终于找到答案了:
@Test
public void methodTest() {
ClassToTest objectToTest = PowerMockito.spy(new ClassToTest());
try {
when(objectToTest, method(ClassToTest.class, "privateMethod", boolean.class)).withArguments(false).thenReturn(mockAsyncTask);
} catch (Exception e) {
e.printStackTrace();
}
}
并且就在 class 声明之前:
@PrepareForTest(ClassToTest.class)