java - Mockito:如何在 Spring bean 中部分模拟字段依赖关系

标签 java spring unit-testing mockito

我有一个具有多个字段依赖项的 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 注释,那么它会为 RepositoryARepositoryB 提供 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 是您的模拟实例。

javadoc here

或者使用Spring的ReflectionTestUtils:

ReflectionTestUtils.setField((plannerService, "thirdPartyService" thirdPartyService);

java doc here

这通常可以在“设置”方法中完成,即用 @Before 注释的方法。

关于java - Mockito:如何在 Spring bean 中部分模拟字段依赖关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48240646/

相关文章:

java - 从同步块(synchronized block)返回同步值

java - 在 View 寻呼机中滚动时折叠工具栏不会折叠

spring - spring 4 中自定义 ExceptionTranslationFilter 来处理 REST AuthenticationException

unit-testing - 在 JSON 内容类型的 grails 单元测试(和一般情况下)中使用自定义渲染器

java - TestNG + Mockito + PowerMock - verifyStatic() 不起作用

java - java中如何将上传的多个pdf文件存储到特定位置?

java - 将数组复制到另一个数组

java - 交易后刷新实体

java - 如何在集群环境中使用Spring Security OAuth

android - 如何在 Android 中的 Android 测试和单元测试之间共享 JSON 文件