我看过this post但仍然很困惑。我想做的是,当我调用我的模拟服务时,我想要调用另一个方法。具体来说,让我向您展示我正在 mock 的类(class)(请记住,如果这很重要,我正在尝试测试演示者类(class)):
这是我正在 mock 的 NewsService 类:
public class NewsService implements INewsServiceContract {
Gson gson;
Callback mCallback;
public NewsService() {
configureGson();
}
private static String readStream(InputStream in) {
StringBuilder sb = new StringBuilder();
try (BufferedReader reader = new BufferedReader(new InputStreamReader(in));) {
String nextLine = "";
while ((nextLine = reader.readLine()) != null) {
sb.append(nextLine);
}
} catch (IOException e) {
e.printStackTrace();
}
return sb.toString();
}
public void setCallBack(Callback cb) {
mCallback = cb; // or we can set up event bus
}
private void configureGson() {
GsonBuilder builder = new GsonBuilder();
builder.excludeFieldsWithoutExposeAnnotation();
gson = builder.create();
}
@Override
public void loadResource() {
new AsyncTask<String, String, String>() {
@Override
protected String doInBackground(String... params) {
String readStream = "";
try {
URL url = new URL("https://api.myjson.com/bins/nl6jh");
HttpURLConnection con = (HttpURLConnection) url.openConnection();
readStream = readStream(con.getInputStream());
} catch (Exception e) {
e.printStackTrace();
}
return readStream;
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
NewsService.this.onRequestComplete(result);
}
}.execute();
}
public void onRequestComplete(String data) {
data = data.replaceAll("\"multimedia\":\"\"", "\"multimedia\":[]");
news.agoda.com.sample.Model.NewsEntities newsEntities = gson.fromJson(data, NewsEntities.class);
mCallback.onResult(newsEntities);
}
}
这没什么花哨的,最后在 onRequestComplete 中它只是用结果调用监听器。如果这很重要的话,这个案例的听众就是我的演示者。
在我的测试用例中,我想验证此回调是否确实发生。我已经用我的模拟服务尝试了以下测试:
@org.junit.Test
public void shouldDisplayResultsOnRequestComplete() throws Exception {
presenter.loadResource();
when(service.loadResource()).thenAnswer(new Answer<Object>() {
Object answer(InvocationOnMock invocation) {
//what do i do in here ?
}
});
}
我想测试的是,如果有人调用 service.loadResouces() 那么他们会收到包含结果的回调。你能帮忙吗?
最佳答案
所以你有一个 Presenter,并且你想测试 NewsService
的 loadResources
是否触发回调,除了... NewsService
不触发回调此处正在测试的类。
loadResources
是否触发回调的测试应该在 NewsServiceTest
中。
如果您对 Presenter 类是否可以正确处理回调调用感兴趣,只需直接调用它并验证它的 react 即可。
但是,如果您仍然想在 Presenter 测试用例中执行这部分测试,那么这真的会很棘手。
您必须首先捕获 setCallback
方法的结果,以便知道在哪里执行回调 - 或者,您可以假设这是 Presenter 实例。
然后在 loadResources
的 Answer
中,您将需要自己简单地触发回调(这与按照我上面的建议直接执行没有太大区别)。这可能很简单:
presenter.onResult(newsEntities);
...带有一些示例 newsEntitities。
我强烈建议您不要这样做,因为您基本上是在 Answer
对象中重新创建 NewsService
的行为。
这是我测试演示者的方法:
presenter.loadResource();
verify(mockNewsService).loadResource();
presenter.onResult(mockedNewsEntities);
// assert/verify if presenter is now in correct state
关于java - Mockito - 如何从模拟调用触发调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42462656/