我有一个具有多个字段依赖项的Spring服务,如下所示。依赖项之一(thirdPartyService
)与外部应用程序通信。我怎么能嘲笑那个?
@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
批注,那么它将为NullpointerException
和RepositoryA
提供RepositoryB
。@Mock
ThirdPartyService thirdPartyService;
@InjectMocks
PlannerService plannerService = newPlannerService();
我如何只模拟
ThirdPartyService
并让Spring注入其他依赖项? 最佳答案
您可以在受测的PlannerService
类中使用setter方法
void setRepositoryA(RepositoryA repository) {
this.repositoryA = repository;
}
然后在测试中使用此方法提供
RepositoryA
的模拟实现或者,您可以@Inject在构造函数中注入存储库,然后在单元测试中使用模拟作为参数调用构造函数。