Mockito:如何模拟 WebClient 配置 Bean

问题描述

我正在使用 Mockio、wiremock 和 WebClient,我想测试我的服务层。 我的目标是使用 webclient 的一个实例并对wiremock 发出真实的请求。

因此,我必须使用标准配置,而不是生产模式下的 oauth 配置。

在服务类中,我执行 reuqets 到另一个 api。所以被测类是用@Service注解的。

这是课程:

@Service
public class UserServiceImpl implements UserService{

    private final Logger log = Logger.getLogger(this.getClass().getName());
    private final WebClient webClient;
    private final ApplicationConstants applicationConstants;

    public UserServiceImpl (WebClient webClient,ApplicationConstants applicationConstants) {
        this.applicationConstants = applicationConstants;
        this.webClient = webClient;
    }

    @Override
    public User getUserById(@NotNull(message = "userId must not be null.") @NotBlank(message = "userId must not be blank.") String userId) {
        return  webClient.get()...
}

我将我的 WebClient 配置为通过使用 @Configuration 注释的类中的两个 Bean 方法使用 Oauth。

@Configuration
public class WebClientConfig {

    @Bean
    public WebClient webClient(OAuth2AuthorizedClientManager authorizedClientManager) {
       ...
    }

    /*
    Manages the auth process and token refresh process
     */
    @Bean
    public OAuth2AuthorizedClientManager authorizedClientManager(
            ClientRegistrationRepository clientRegistrationRepository,OAuth2AuthorizedClientRepository authorizedClientRepository) {

        ...
    }
}

因为想使用没有oauth的webClient调用wiremock,所以想替换Beans返回一个简单的Webclient.builder().build();

所以我做到了:

@ExtendWith({SpringExtension.class,wiremockExtension.class,MockitoExtension.class})
public class TestClass {

    @Mock
    WebClientConfig webClientConfig;

    @MockBean
    WebClient webClient;

    @InjectMocks 
    UserServiceImpl userService;

总的来说,根据我对 Mockito 的理解,我会将我的测试类(userServiceImpl)与 @InjectMocks 一起使用,因此使用了一个真实的实例并注入了依赖项。因此我必须为 Webclient 提供一个 Mock。由于我不想模拟网络客户端,只想对其进行不同的配置,因此我不必使用 @Mock。相反,它应该像 @MockBean 这样的东西,因为这个注释会创建一个 bean 并替换上下文中的现有 bean。所以我必须用@Mock 模拟 Webclientconfig 类并定义类似

when(webclientConfig).webclient(any(OAuth2AuthorizedClientManager.class)).thenReturn(Webclient.builder.build);

但这不起作用,因为我总是在调用时遇到空指针异常。 所以基本问题是:

  1. 我对 Mockito 的理解是否正确?
  2. 我必须如何管理 Web 客户端配置?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)