我正在使用mockio、wiremock和webclient,我想测试我的服务层。我的目标是使用webclient的一个示例并对wiremock进行真正的请求。
因此,我必须使用标准配置,而不是生产模式下的oauth配置。
在服务类中,我对另一个api执行reuqets。所以被测试的类是用@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()...
}
我在一个用@configuration注解的类中通过两个bean方法将我的webclient配置为使用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,所以我想替换bean来返回一个简单的webclient.builder().build();
所以我做了:
@ExtendWith({SpringExtension.class, WireMockExtension.class, MockitoExtension.class})
public class TestClass {
@Mock
WebClientConfig webClientConfig;
@MockBean
WebClient webClient;
@InjectMocks
UserServiceImpl userService;
一般来说,根据我对mockito的理解,我会将我的被测类(userserviceinpl)与 @InjectMocks
,这样就使用了一个真实的示例并注入了依赖关系。因此,我必须为webclient提供一个mock。因为我不想模仿webclient,只想将其配置为不同的,所以我不必使用 @Mock
. 相反,它应该是这样的 @MockBean
因为这个注解创建了一个bean并替换了上下文中现有的bean。所以我必须用@mock来模拟webclientconfig类,并定义如下内容
when(webclientConfig).webclient(any(OAuth2AuthorizedClientManager.class)).thenReturn(Webclient.builder.build);
但这不起作用,因为我总是在调用中遇到nullpointer异常。所以基本问题是:
我对Mockito的理解正确吗?
如何管理webclient配置?
暂无答案!
目前还没有任何答案,快来回答吧!