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

标签 java unit-testing mockito

我看过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/

相关文章:

java - 远程服务器上的 Soap 调用速度较慢

java - 单元测试 : Call @PostConstruct after defining mocked behaviour

angular - Angular 组件单元测试实际上是单元测试吗?

ios - cellForRowAtIndexPath 单元测试崩溃

android - 如何在 android 中模拟 MotionEvent 和 SensorEvent 进行单元测试?

java - ArgumentMatchers.any() 与 Mockito 2 中的其他匹配器

java - Case 表达式必须是常量表达式

java - 如何使用 POI Excel 以编程方式拉伸(stretch)列以适合文本?

java - 改变窗口背景颜色的 JFrame 按钮

java - 用于测试来自数据库的数据的 JUnit 测试用例是最新的而不是过时的