[英]Mocking a bean that is levels down from the unit being tested
我有 2 项服务
服务A
服务乙
我正在测试服务 A。服务 A 获取注入的服务 B 依赖项。服务 B 需要 JSoup 连接,因此我试图模拟这个 Jsoup 连接。 服务 B 中的连接由 Bean ConnectionHandler 处理,因此我试图:
创建真正的服务 A 实例 使用 MockServiceB 注入服务 A 实例 使用 MockConnectionHandler 注入 MockServiceB (并从那里模拟方法调用)
这可能吗?
如果要进行单元测试,则应单独测试Service A
为此,您应该创建一个Service B
的模拟并将其注入到Service A
。 您应该模拟完整的Service B
,并让Service A
调用的方法返回您需要的值。 因此, Service B
根本不需要MockConnectionHandler
。
public class ServiceA {
private ServiceB serviceB;
@Inject
public void setServiceB(ServiceB serviceB) {
this.serviceB = serviceB;
}
public MonthlyStatistic createStatistics(int categoryId) {
List<DailyStatistic> data = serviceB.fetchData(categoryId);
return computeMonthlyStatistic(data);
}
private void computeMonthlyStatistic(List<DailyStatistic> data) { ... }
}
public class Service B {
@Inject
private Connection connection;
public List<DailyStatistic> fetchData(int categoryId) {
return mapToDailyStatistics(queryDb(categoryId));
}
private List<DailyStatistic> mapToDailyStatistics(List<Row> rows) { ... }
private List<Row> queryDb(int categoryId) { ... }
}
@Test
public void testCreateStatistics() {
ServiceB mockedServiceB = mock(ServiceB.class);
when(mockedServiceB.fetchData(anyInt())).thenReturn(...);
ServiceA serviceUnderTest = new ServiceA();
serviceUnderTest.setServiceB(mockedServiceB);
assertEquals(..., serviceUnderTest.createStatistics(3));
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.