2017-02-25 83 views
0

我看过this post但仍然困惑。我想要做的是,当我打电话给我的模拟服务时,我想要调用另一个方法。特别让我告诉你,我嘲讽类(记住我试图测试演示类,如果该事项):Mockito - 如何通过模拟电话触发呼叫?

这里是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

因此,您有一位演示者,并且您想要测试loadResourcesNewsService是否触发回调,但... NewsService不是此处正在测试的类。

如果loadResources触发回调,测试应该在NewsServiceTest

如果您对Presenter类可以正确处理回调调用感兴趣,可以直接调用它并验证它是如何反应的。然而,如果你仍然想在Presenter测试用例中进行这部分测试,那真的会非常棘手。

您必须首先从setCallback方法中捕获结果,以便知道回拨的位置 - 或者,您可以假设这是Presenter实例。

然后在Answer from loadResources您将需要自己简单地触发回调(这跟直接按照我上面的建议做的没什么两样)。这可能是如此简单:

presenter.onResult(newsEntities); 

...与一些示例newsEntitities。

我会强烈反对这一点,虽然因为你基本上在Answer对象中重新创建NewsService的行为。

这里的是我如何将考验主持人:

presenter.loadResource(); 

verify(mockNewsService).loadResource(); 

presenter.onResult(mockedNewsEntities); 

// assert/verify if presenter is now in correct state