繁体   English   中英

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

[英]How to write a unit test for custom Rest template interceptor in spring boot

我的 java spring 应用程序中有以下自定义拦截器,如下所示。

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);
    }

}

但我正在寻找一些关于如何为此 class 编写单元测试的文档,但找不到。 关于如何测试的任何输入都会非常有帮助

单元测试 class 与单元测试任何 class 的方式相同。

  1. classToTest = new 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.
    }
}

假设您只想测试拦截,并且您已经设置了 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));
  }

所以步骤是:创建您的 class 以进行测试

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM