gpt4 book ai didi

java - Mockito - 如何从模拟调用触发调用?

转载 作者:行者123 更新时间:2023-12-01 08:49:43 25 4
gpt4 key购买 nike

我看过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,并且你想测试 NewsServiceloadResources 是否触发回调,除了... NewsService 不触发回调此处正在测试的类。

loadResources 是否触发回调的测试应该在 NewsServiceTest 中。

如果您对 Presenter 类是否可以正确处理回调调用感兴趣,只需直接调用它并验证它的 react 即可。

但是,如果您仍然想在 Presenter 测试用例中执行这部分测试,那么这真的会很棘手。

您必须首先捕获 setCallback 方法的结果,以便知道在哪里执行回调 - 或者,您可以假设这是 Presenter 实例。

然后在 loadResourcesAnswer 中,您将需要自己简单地触发回调(这与按照我上面的建议直接执行没有太大区别)。这可能很简单:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com