【问题标题】:Mocking return with any passed argument使用任何传递的参数模拟返回
【发布时间】:2018-08-21 05:05:13
【问题描述】:

在尝试模拟 MavenXpp3Reader 时,read() 方法仍然为空,尽管我尝试模拟返回。这是我的尝试

    String testVer = "1.0.0.TEST";
    MavenXpp3Reader mockReader = mock(MavenXpp3Reader.class);
    Model mockModel = mock(Model.class);
    when(mockModel.getVersion()).thenReturn(testVer);
    when(mockReader.read(new FileReader("pom.xml"))).thenReturn(mockModel);

    Model model = mockReader.read(new FileReader("pom.xml"));

model 保持为空。基本上,无论传递什么参数,只要调用MavenXpp3Reader.read(),我都想返回mockModel

【问题讨论】:

标签: java unit-testing mockito


【解决方案1】:

基本上,我想在 MavenXpp3Reader.read() 时返回 mockModel 被调用,无论传递什么参数。

您可以在模拟录制中使用Mockito.any(),但它不会编译,因为MavenXpp3Reader.read() 已重载。
您应该指定与特定重载匹配的类:

when(mockReader.read(Mockito.any(Reader.class))).thenReturn(mockModel);

但在大多数情况下,您希望避免使用任何匹配器,因为这不够严格。


关于你的模拟录音:

when(mockReader.read(new FileReader("pom.xml"))).thenReturn(mockModel);

这里不会用到:

Model model = mockReader.read(new FileReader("pom.xml"));

因为您指定 FileReader 参数的方式(没有软参数匹配器)使 Mockito 依赖类的 equals() 方法来考虑匹配,new FileReader("pom.xml").equals(new FileReader("pom.xml"))false 返回为 FileReader不会覆盖equals()
但它会起作用:

FileReader reader = new FileReader("pom.xml")
when(mockReader.read(reader)).thenReturn(mockModel);
Model model = mockReader.read(reader);

【讨论】:

  • 我想有一点不同的问题:我想在调用 MavenXpp3Reader.read() 时返回 mockModel,无论传递什么参数
【解决方案2】:

尝试使用 Mockito 框架中的 any() 而不是 (new FileReader("pom.xml"))

例如:

import static org.mockito.ArgumentMatchers.any;

...
when(mockReader.read(any(Reader.class)).thenReturn(mockModel);
...

【讨论】:

  • 您的总体思路是正确的。但是这里any() 不能在这里工作,因为read() 过载了。所以编译器会认为调用是不明确的。
  • 现在好多了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-21
  • 2018-08-02
  • 1970-01-01
  • 2021-10-21
  • 1970-01-01
相关资源
最近更新 更多