我目前正在编写一个测试,尝试使用模拟服务。然而,我的嘲笑回应没有按预期返回。 以下是我的测试课程的简化版本。
@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 与模拟不同。
您应该从 ParentService 中删除 @Autowired,因为 @InjectMocks 已经实例化了该对象。
有关 @Autowired 和 @InjectMocks 之间差异的更多详细信息,您可以参考这篇 Stack Overflow 帖子:Mockito 中 @InjectMocks 和 @Autowired 用法的区别。