如何在spring引导中为自定义Rest模板拦截器编写单元测试



在我的javaspring应用程序中,我有如下自定义拦截器。

public class AuthInterceptor implements ClientHttpRequestInterceptor {
private final String encodedCredentials;
public AuthInterceptor(String username, String password) {
this(username, password, (Charset) null);
}
public AuthInterceptor(String username, String password, @Nullable Charset charset) {
this.encodedCredentials = HttpHeaders.encodeBasicAuth(username, password, charset);
}
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
HttpHeaders headers = request.getHeaders();
headers.setBasicAuth(this.encodedCredentials);
return execution.execute(request, body);
}
}

但我正在寻找一些关于如何为这个类编写单元测试的文档,但找不到。任何关于如何测试的输入都将对非常有用

假设您只想测试拦截,并且已经设置了mockito:

@Test
@DisplayName("Should add correct header to authorization")
void encodeProperly() throws Exception {
AuthInterceptor cut  = new AuthInterceptor("someuserName","somePaswwordName");
MockHttpServletRequest request = new MockHttpServletRequest("GET", "/test");
cut.intercept(request, null,null,mockedExecution );
ArgumentCaptor<HttpRequest> argumentCapture = ArgumentCaptor.forClass(HttpRequest.class) ;
verify(mockedExecution.execute(argumentCapture.capture(),any()));

assertEquals(expectedEncodedCredentials,argumentCapture.getValue().getHeaders().get(HttpHeaders.AUTHORIZATION));
}

因此步骤是:创建您的类以测试剪切

然后创建MockHttpServlet请求的模拟,这将有助于执行您的检查

以单元测试任何类的方式对该类进行单元测试。

  1. classToTest=新的AuthInterceptor((
  2. 使用Mock对象调用方法

一些示例代码:

@ExtendWith(MockitoExtension.class)
public class TestAuthInterceptor
{
private AuthInterceptor classToTest;
@Mock
private ClientHttpRequestExecution mockClientHttpRequestExecution;

@Mock
private ClientHttpResponse mockClientHttpResponse;

@Mock
private HttpHeaders mockHttpHeaders;

@Mock
private HttpRequest mockHttpRequest;
@BeforeEach
public void beforeEach()
{
classToTest = new AuthInterceptor("username", "password");
}

@Test
public void intercept_allGood_success()
{
final ClientHttpResponse actualResult;
final byte[] inputBody = null;

doReturn(mockHttpHeaders).when(mockHttpRequest).getHeaders();
doReturn(mockClientHttpResponse).when(mockClientHttpRequestExecution).execute(mockHttpRequest, inputBody);

actualResult = classToTest.intercept(mockHttpRequest, inputBody, mockClientHttpRequestExecution);

assertSame(mockClientHttpResponse, actualResult);
// other asserts as desired.
}
}

最新更新