问题描述
我正在使用 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);
但这不起作用,因为我总是在调用时遇到空指针异常。 所以基本问题是:
- 我对 Mockito 的理解是否正确?
- 我必须如何管理 Web 客户端配置?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)