Mockito - 如何通过模拟通话触发通话?

时间:2017-02-25 23:02:28

标签: java unit-testing mockito

我看了this post但仍感到困惑。我想做的是,当我调用我的模拟服务时,我想要另一种方法被调用。特别是让我告诉你我正在嘲笑的课程(请记住,如果重要的话,我正在尝试测试演示者课程):

这是我正在嘲笑的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(),那么他们会收到一个回调结果。你能帮忙吗?

1 个答案:

答案 0 :(得分:1)

所以你有一个Presenter,你想测试navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default) navigationController?.navigationBar.shadowImage = UIImage() loadResources是否会触发回调,除了...... NewsService不是这里测试的类。

NewsService触发回调的测试应该在loadResources

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

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

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

然后在来自setCallback的{​​{1}}中你需要自己简单地触发回调(这与我上面提到的直接做的没什么不同)。这可以很简单:

Answer

......有一些示例新闻动态。

我建议强烈反对这一点,因为您基本上是在loadResources对象中重新创建presenter.onResult(newsEntities); 的行为。

以下是我如何测试演示者:

NewsService