mockito 执行(),如何存根的响应得到传入我的回调函数?

xmjla07d  于 2023-02-12  发布在  其他
关注(0)|答案(1)|浏览(124)

我有下面的代码.字典只是一个 Package 器类型的字符串列表.

public Dictionary getDictionary(int size, String text) {
    return restTemplate.execute(url, HttpMethod.GET, null, response -> {
        BufferedReader br = new BufferedReader(new InputStreamReader(response.getBody()));
        List<String> words = new ArrayList<>();
        String line;
        while((line = br.readLine()) != null){
            if (isMatch(line, size, text)){
                words.add(line.toLowerCase());
            }
        }
        br.close();
        return new Dictionary(words);
    });
}

private boolean isMatch(String word, int size, String text) {
    if(word.length() != size) {
        return false;
    }
    return wordUtil.isAnagram(word, text);
}

我现在很难测试这个方法。HTTP调用只是返回一个带有新的行分隔符的纯文本单词列表。
我想写一个测试,在那里我可以stub response. getBody()。
也就是说,我希望response. getBody()返回一堆单词,并且我将Assert返回的Dictionary只包含大小为size的单词,以及字符串text的变位词。
这可能吗?
谢谢

63lcw9qa

63lcw9qa1#

可以存根接受回调的方法,并在调用存根时执行回调。
其目的是:

  • 调用存根方法时,使用when/thenAnswer执行代码
  • 使用传递给thenAnswerinvocationOnMock获取回调示例
  • 调用回调,提供必要的参数
@Test
void testExecute() {
    String responseBody = "line1\nline2";
    InputStream responseBodyStream = new ByteArrayInputStream(responseBody.getBytes());
    ClientHttpResponse httpResponse = new MockClientHttpResponse(responseBodyStream, 200);
    when(restTemplate.execute(any(URI.class), eq(HttpMethod.GET), eq(null), any())).thenAnswer(
      invocationOnMock -> {
          ResponseExtractor<MyDictionary> responseExtractor = invocationOnMock.getArgument(3);
          return responseExtractor.extractData(httpResponse);
      }
    );
    MyDictionary ret = aController.getDictionary(1, "text");
    // assert ret against your expecations
}

话虽如此,这对于手头的任务来说似乎有点复杂。恕我直言,如果将处理Http的逻辑与业务逻辑分开,您会更好。提取一个接受inputStream的方法,并单独测试它。

相关问题