我试图模拟一个具有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);