我在 Spring Boot 应用程序中遇到单元测试问题,其中在服务方法测试期间未按预期调用特定存储库方法。尽管使用 Mockito 设置了测试,但存储库方法似乎被跳过了。
这是我得到的错误:
19:47:54.914 [Test worker] DEBUG org.reactor.util.Loggers - Using Slf4j logging framework
19:47:54.963 [Test worker] INFO com.myapp.service.EntityManagementService - No entity found for reference number: referenceNumber
Wanted but not invoked:
entityRepository.findByRefNumber("referenceNumber");
-> at com.myapp.service.EntityManagementServiceTest.shouldInvokeRepositoryWhenProcessingEntityUpdate(EntityManagementServiceTest.java:150)
Actually, there were zero interactions with this mock.
我正在测试一种处理状态更新并与 GraphQL 客户端交互以进行进一步操作的服务方法。服务方法
*processStatusChange*
应使用存储库方法 *findEntityByRef*
获取实体。但是,即使我模拟此方法以返回特定对象,它的行为就好像没有找到实体一样。
这是服务方法和测试设置的简化版本:
服务方式:
@Autowired
private EntityRepository entityRepository;
public void processEntityUpdate(String refNumber) {
Optional<Entity> entityOptional = entityRepository.findByRefNumber(refNumber);
if (entityOptional.isEmpty()) {
log.info("Entity not found for reference number: {}", refNumber);
return;
}
Entity entity = entityOptional.get();
updateEntityDetails(entity);
}
protected void updateEntityDetails(Entity entity) {
// Interaction with GraphQL client to update details
}
}
测试设置:
@ExtendWith(MockitoExtension.class)
public class EntityManagementServiceTest {
@Mock
private EntityRepository entityRepository;
@InjectMocks
@Spy
private EntityManagementService entityManagementService;
@BeforeEach
void setUp() {
MockitoAnnotations.openMocks(this);
Entity mockEntity = new Entity();
mockEntity.setRefNumber("referenceNumber");
when(entityRepository.findByRefNumber("referenceNumber")).thenReturn(Optional.of(mockEntity));
}
@Test
void shouldInvokeRepositoryWhenProcessingEntityUpdate() {
entityManagementService.processEntityUpdate("referenceNumber");
verify(entityRepository).findByRefNumber("referenceNumber");
}
}
我预计会调用
*findEntityByRef*
并进行测试来验证其调用,但测试失败,说明未调用该方法。
我已经在服务上使用
@Spy
和 @InjectMocks
设置了测试,以使用真实的方法实现和模拟依赖项。这是特别必要的,因为 updateEntityStatus
类中的方法 StatusService
与构造 GraphQL 客户端的另一个方法交互,我也需要测试该客户端。
我认为你的模拟初始化出错了(或者发生了两次)。您应该使用类注释“@ExtendWith(MockitoExtension.class)”或使用“MockitoAnnotations.openMocks(this)”进行手动初始化。 所以简单的答案可能是:只需删除“MockitoAnnotations.openMocks(this)”即可。