Mockito 测试失败并显示“想要但未调用;”事实上,零互动的错误

问题描述 投票:0回答:1

我在 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 客户端的另一个方法交互,我也需要测试该客户端。

java spring-boot testing junit mockito
1个回答
0
投票

我认为你的模拟初始化出错了(或者发生了两次)。您应该使用类注释“@ExtendWith(MockitoExtension.class)”或使用“MockitoAnnotations.openMocks(this)”进行手动初始化。 所以简单的答案可能是:只需删除“MockitoAnnotations.openMocks(this)”即可。

© www.soinside.com 2019 - 2024. All rights reserved.