spring - Mockito 模拟没有正确匹配参数(?)
问题描述
我正在尝试在服务层中存根一种方法来测试另一个对象:
@SpringBootTest
@RunWith(JUnitPlatform.class)
class WorkreportCrudFacadeTest {
private static Logger LOGGER = LogManager.getLogger(WorkreportCrudFacadeTest.class);
@Test
public void detailTest() {
final AccessRightsService ars = Mockito.mock(AccessRightsService.class);
final SystemPriceSettingService spss = Mockito.mock(SystemPriceSettingService.class);
final WorkreportActivityRepository wrar = Mockito.mock(WorkreportActivityRepository.class);
final WorkreportRepository wrr = Mockito.mock(WorkreportRepository.class);
final DomainObjectTools dot = Mockito.mock(DomainObjectTools.class);
final ApplicationEventPublisher aep = Mockito.mock(ApplicationEventPublisher.class);
Mockito.when(ars.hasEmployeeRightsToWorkReport(
ArgumentMatchers.any(Employee.class), ArgumentMatchers.any(Workreport.class)
)
).thenReturn(true);
final WorkreportCrudFacade s = new WorkreportCrudFacade(ars, spss, wrar, wrr, dot, aep);
final EmployeeId employeeId = new EmployeeId(154149756298300L);
final WorkreportId workreportId = new WorkreportId(154149757395700L);
final Workreport detail = s.detail(workreportId, employeeId);
LOGGER.debug("Detail: {}", detail);
}
}
和调用测试方法的方法:
public Workreport detail(final WorkreportId workreportId, final EmployeeId employeeId) {
final Workreport workreport = domainObjectTools.getWorkreportOrThrowNotFoundException(workreportId);
final Employee viewer = domainObjectTools.getEmployeeOrThrowNotFoundException(employeeId);
boolean hasRights = accessRightsService.hasEmployeeRightsToWorkReport(viewer, workreport);
LOGGER.debug("Has rights: {}", hasRights);
if (!hasRights) {
throw new ForbiddenException();
}
return workreport;
}
hasEmployeeAccessToWorkReport
但是当我在实例上调用测试方法时WorkreportCrudFacade
,该方法没有正确存根(它应该返回true
,但返回false
)。
我敢肯定这会是一些细节,但我无法找出问题所在 - 可能是参数匹配器中的问题,但不确定。
我正在使用 Mockito 2.22.0。
解决方案
由于 Mockito any(Class) 和 anyInt 系列匹配器执行类型检查,因此它们不会匹配空参数。而是使用 isNull 匹配器。
我认为这里发生了以下情况: YourDomainObjectTools
是一个空的模拟(不是存根),因此它返回 nullWorkreport
和 null Employee
。它导致调用accessRightsService.hasEmployeeRightsToWorkReport(null,null)
. 值与null
不匹配ArgumentMatchers.any(Class)
。
推荐阅读
- python - 如何检查用户状态何时在不和谐中发生变化?
- simulink - Simulink Stateflow:等待并行状态
- c# - 通过分组查询多对多表
- python - 如何让python代码在if else语句中遇到else或elif而不是退出代码后回到原来的问题
- excel - 如何根据趋势对图表进行分组?
- php - php在两个分隔符之间爆炸并且分隔符不丢失
- python - 是否可以在不再次运行 if 语句的情况下按下键
- sql - 如何根据事件(而不是日期)在 SQL 中计算客户保留率?
- c# - FFI 的 size_t 兼容类型
- perl - perl 如何包含一个预定义的变量列表