【问题标题】:Unit tests for following code with Mockito使用 Mockito 对以下代码进行单元测试
【发布时间】:2021-03-11 09:04:39
【问题描述】:
List<String> lineArray = new ArrayList<String>();
Resource resource = resourceLoader.getResource("classpath:abc.txt");
InputStream in = resource.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String line;
while ((line = reader.readLine()) != null) {
    if(line.startsWith("#")) {
        lineArray.add(reader.readLine());           }
}
reader.close();

以上代码是返回 void 的函数的一部分,我可以模拟 Resource 和 ResourceLoader,但无法找到模拟 BufferedReader 的方法。我还想模拟 List 并在 List.add() 上调用 Mockito.verify()。

【问题讨论】:

  • 您可以模拟Resource 来为任意字符串数据返回一个有效的InputStream。为什么你不能在方法完成后检查lineArray?如果lineArray 是一个局部变量,如果它不返回任何内容或修改任何状态,那么整个方法的意义何在?
  • 有一种模式:将new BufferedReader(new InputStreamReader(in));提取到具有包可见性的方法中,并将其覆盖到测试中,以便测试中使用的类返回一个mock。

标签: java spring-boot mockito junit4


【解决方案1】:

如果列表是该方法的本地列表,则您无需测试任何副作用。再说一次,在非测试代码中使用此方法也没有明显的目的,因为您会将数据读入列表中,然后将其丢弃。

您需要将列表作为参数注入方法:

void yourMethod(List<String> lineArray) {
  Resource resource = resourceLoader.getResource("classpath:abc.txt");
  // ... etc.
}

您现在可以通过在您的测试中调用 yourMethod 并使用 List 参数来测试它,您可以在之后进行检查。

我还想模拟 List 并在 List.add() 上调用 Mockito.verify()。

基本上没有必要模拟一个列表,特别是为此目的:注入一个列表,一个普通的ArrayList,并在方法调用后检查列表是否增长了1。

【讨论】:

    猜你喜欢
    • 2017-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-15
    • 2016-03-15
    • 1970-01-01
    • 2020-02-22
    相关资源
    最近更新 更多