我有一个具有多个字段依赖项的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批注,那么它将为NullpointerExceptionRepositoryA提供RepositoryB

@Mock
ThirdPartyService thirdPartyService;

@InjectMocks
PlannerService plannerService = newPlannerService();


我如何只模拟ThirdPartyService并让Spring注入其他依赖项?

最佳答案

您可以在受测的PlannerService类中使用setter方法

void  setRepositoryA(RepositoryA repository) {
    this.repositoryA = repository;
}


然后在测试中使用此方法提供RepositoryA的模拟实现

或者,您可以@Inject在构造函数中注入存储库,然后在单元测试中使用模拟作为参数调用构造函数。

10-04 10:06