我有一个具有多个字段依赖项的 Spring 服务,如下所示。依赖项之一 (thirdPartyService
) 与外部应用程序进行通信。我怎么能 mock 它呢?
@Service
public class PlannerServiceImpl implements PlannerService {
private static final Logger LOG = LoggerFactory.getLogger(PlannerServiceImpl.class);
@Autowired
private RepositoryA repositoryA;
@Autowired
private RepositoryB repositoryB;
@Autowired
private ThirdPartyService thirdPartyService ;
}
如果我使用 Mock 注释,那么它仍然连接到外部应用程序,而不是返回模拟响应:
@Mock
ThirdPartyService thirdPartyService;
@Autowired
PlannerService plannerService;
如果我使用 InjectMocks
注释,那么它会为 RepositoryA
和 RepositoryB
提供 NullpointerException
。
@Mock
ThirdPartyService thirdPartyService;
@InjectMocks
PlannerService plannerService = newPlannerService();
如何才能模拟 ThirdPartyService
并让 Spring 注入(inject)其他依赖项?
最佳答案
您可以使用Whitebox
修改Spring注入(inject)的内容。 (可选)由于您使用的是 Spring,因此您还可以使用 ReflectionTestUtils.setField
在 Spring 注入(inject)依赖项之后,在单元测试运行之前,您可以使用 org.powermock.reflect.Whitebox 来修改 Spring 的注入(inject)。像这样的事情
Whitebox.setInternalState(plannerService, "thirdPartyService" thirdPartyService);
其中 thirdPartyService
是您的模拟实例。
或者使用Spring的ReflectionTestUtils
:
ReflectionTestUtils.setField((plannerService, "thirdPartyService" thirdPartyService);
这通常可以在“设置”方法中完成,即用 @Before
注释的方法。
关于java - Mockito:如何在 Spring bean 中部分模拟字段依赖关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48240646/