Mockito 模拟未注入到服务类中

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

我目前正在编写一个测试,尝试使用模拟服务。然而,我的嘲笑回应没有按预期返回。 以下是我的测试课程的简化版本。

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@Testcontainers
@ActiveProfiles("test")
@ExtendWith(MockitoExtension.class)
public class ParentServiceTest {

    @InjectMocks
    @Autowired
    private ParentService parentService;

    @Mock
    private ChildService childService;

    @BeforeEach
    public void init(){
        MockitoAnnotations.openMocks(this);
        Mockito.doReturn(otherDto).when(childService).getResponse(Mockito.any(String.class), Mockito.any(DTO.class));
    }

    @Test
    public void createAnswerTEST_Successful(){
        OtherDTO otherDto = parentService.doSomething(someString, dto);
    }
}

这就是 ParentService 的样子:

@Service
@RequiredArgsConstructor
public class ParentService{

    private final ChildService childService;

    public OtherDTO doSomething(String someString, DTO dto){
        //HERE THE MOCKED OBJECT SHOULD BE RECEIVED
        OtherDTO otherDTO = childService.getResponse(someString, someDTO)
    }

}

这是儿童服务:

@Service
@RequiredArgsConstructor
public class ChildService {

    public OtherDTO getResponse(String someString, DTO someDto){
        return otherDTO
    }

}

我可以看到以下内容: 当我调试测试并在函数调用之前停止时,我可以在调试器中看到类似

ChildService childService = {ChildService@21915}
的内容,并且还在我的 ParentService 中看到以下
ChildService childService = {ChildService@21990}
所以我可以看到,实际上模拟实际上并没有作为 ChildService 实例注入ParentService 与模拟不同。

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

您应该从 ParentService 中删除 @Autowired,因为 @InjectMocks 已经实例化了该对象。

有关 @Autowired 和 @InjectMocks 之间差异的更多详细信息,您可以参考这篇 Stack Overflow 帖子:Mockito 中 @InjectMocks 和 @Autowired 用法的区别。

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