Java Mockito - 如何模拟在构造函数中初始化的私有成员



我试图模拟一个具有collect函数的成员来返回一个 Mock 对象,而不是进入函数本身。 但是,无论我如何试图嘲笑私人成员,它都会进入该功能。

public class BasicReportManager implements ReportManager {
private final ReportCollector reportCollector;
public BasicReportManager(String id) {
this.reportCollector = new ReportCollector(id);
}
private void processReport(ReportType reportTypeToProcess) {
switch (reportTypeToProcess) {
case REPORT1:
Sendable collect = reportCollector.collect();
}
}
}

测试代码 -

ReportCollector reportData = Mockito.mock(ReportCollector.class);
Sendable sendable = Mockito.mock(Sendable.class);
Mockito.when(reportData.collect()).thenReturn(sendable);

但是,当我调用processReport()时,收集函数就会发生。 我该如何解决它?

基本报告管理器测试大楼 -

basicReportManager = new BasicReportManager("1");

谢谢。

如果你想模拟BasicReportManager使用的ReportCollector实例,那么你必须在测试用例创建BasicReportManager时注入它。例如:

ReportCollector reportData = Mockito.mock(ReportCollector.class);
Sendable sendable = Mockito.mock(Sendable.class);
Mockito.when(reportData.collect()).thenReturn(sendable);
BasicReportManager basicReportManager = new BasicReportManager("1", reportData);
// now your test invocation on BasicReportManager will use the mocked instance of ReportCollector

你可以考虑其他选择,比如为ReportCollector提供一个工厂,但这个简单的事实仍然存在:为了让BasicReportManager在你的测试用例中使用模拟的ReportCollector实例,你必须能够(以某种方式!)为BasicReportManager提供模拟实例。

您正在模拟一个ReportCollector对象,但您从未在BasicReportManager中使用它。
您应该更改构造BasicReportManager

public BasicReportManager(ReportCollector reportCollector) {
this.reportCollector = reportCollector;
}

然后你可以做:

ReportCollector reportData = Mockito.mock(ReportCollector.class);
Sendable sendable = Mockito.mock(Sendable.class);
Mockito.when(reportData.collect()).thenReturn(sendable);
basicReportManager = new BasicReportManager(reportData);

相关内容

  • 没有找到相关文章

最新更新