Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Mockito-如何从模拟呼叫触发呼叫?_Java_Unit Testing_Mockito - Fatal编程技术网

Java Mockito-如何从模拟呼叫触发呼叫?

Java Mockito-如何从模拟呼叫触发呼叫?,java,unit-testing,mockito,Java,Unit Testing,Mockito,我已经看过了,但还是很困惑。我想做的是,当我调用我的模拟服务时,我希望调用另一个方法。具体地说,让我向您展示我正在嘲笑的类(请记住,如果有必要,我正在尝试测试演示者类): 这是我嘲笑的新闻服务类: public class NewsService implements INewsServiceContract { Gson gson; Callback mCallback; public NewsService() { configureGs

我已经看过了,但还是很困惑。我想做的是,当我调用我的模拟服务时,我希望调用另一个方法。具体地说,让我向您展示我正在嘲笑的类(请记住,如果有必要,我正在尝试测试演示者类):

这是我嘲笑的新闻服务类:

    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);
    }
}
公共类新闻服务实现INewsServiceContract{
Gson-Gson;
回调mCallback;
公共新闻服务(){
configureGson();
}
私有静态字符串readStream(InputStream-in){
StringBuilder sb=新的StringBuilder();
try(BufferedReader=new BufferedReader(new InputStreamReader(in));){
字符串nextLine=“”;
而((nextLine=reader.readLine())!=null){
某人附加(下一行);
}
}捕获(IOE异常){
e、 printStackTrace();
}
使某人返回字符串();
}
公共无效集合回调(回调cb){
mCallback=cb;//或者我们可以设置事件总线
}
私有void configureGson(){
GsonBuilder=新的GsonBuilder();
builder.excludeFieldswithout exposeannotation();
gson=builder.create();
}
@凌驾
公共void loadResource(){
新建异步任务(){
@凌驾
受保护的字符串doInBackground(字符串…参数){
字符串readStream=“”;
试一试{
URL=新URL(“https://api.myjson.com/bins/nl6jh");
HttpURLConnection con=(HttpURLConnection)url.openConnection();
readStream=readStream(con.getInputStream());
}捕获(例外e){
e、 printStackTrace();
}
返回readStream;
}
@凌驾
受保护的void onPostExecute(字符串结果){
super.onPostExecute(结果);
NewsService.this.onRequestComplete(结果);
}
}.execute();
}
公共void onRequestComplete(字符串数据){
data=data.replaceAll(“\”多媒体\“:\”,“\”多媒体\“:[]”);
news.agoda.com.sample.Model.NewsEntities NewsEntities=gson.fromJson(数据,NewsEntities.class);
onResult(新闻实体);
}
}
这一点也不奇怪,在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 ? 
    }

});
}
@org.junit.Test
public void shouldDisplayResultsOnRequestComplete()引发异常{
loadResource();
when(service.loadResource()).thenAnswer(new-Answer()){
对象应答(调用锁调用){
//我在这里干什么?
}
});
}

我想测试的是,如果有人调用service.loadResources(),他们就会收到一个返回结果的调用。你能帮忙吗?

所以你有一个演示者,你想测试
新闻服务的
loadResources
是否触发回调,除了<代码>新闻服务
不是此处测试的类

如果
loadResources
触发回调,则测试应在
NewsServiceTest
中进行

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

然而,如果您仍然想在Presenter测试用例中进行这部分测试,那么这将是非常棘手的

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

然后在
loadResources
Answer
中,您只需自己触发回调(这与我上面建议的直接执行回调没有太大区别)。这可以简单到:

presenter.onResult(newsEntities);
…带有一些示例新闻实体

我强烈建议您不要这样做,因为您基本上是在
Answer
对象中重新创建
NewsService
的行为

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

presenter.loadResource();

verify(mockNewsService).loadResource();

presenter.onResult(mockedNewsEntities);

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