junit 使用WebTarget的单元测试方法如何在内部调用?

7gcisfzg  于 2023-03-30  发布在  其他
关注(0)|答案(1)|浏览(141)

我正在尝试对下面的方法进行单元测试。它发出了一个WS调用,响应中包含了一个我需要在其他地方使用的字符串。

String[] getPathFromWS(WebTarget target) throws RuntimeException, IOException {
    
          
    
            Response response = target.request().header(AUTHORIZATION, getAuthorizationToken()).get();
    
            if (response.getStatus() != Response.Status.OK.getStatusCode()) {
                //do something
}
           //create responseArray from WS
            return responseArray;
        }

下面是JUnit测试。我试图通过一个模拟WebTarget并使用它来生成所需的响应。

@Before
        public void setUp() {
            chemistryLicenseManager = new ChemistryLicenseManager(configMock);
        }
    
     @Test
        public void getPathFromWS_success() throws IOException {
    
            WebTarget webTargetMock = Mockito.mock(WebTarget.class);
            Builder builderMock = Mockito.mock(Builder.class);
            Response responseMock = Mockito.mock(Response.class);
    
            when(webTargetMock.request()).thenReturn(builderMock);
            when(builderMock.header(ArgumentMatchers.anyString(), ArgumentMatchers.anyString())).thenReturn(builderMock);
            when(builderMock.get()).thenReturn(responseMock);
    
            String jsonResponse = "{ \"" + "someKey" + "\": \"dummy paths\" }";
    
            when(responseMock.getStatus()).thenReturn(Response.Status.OK.getStatusCode());
            when(responseMock.readEntity(String.class)).thenReturn(jsonResponse);
    
            String[] result = chemistryLicenseManager.getLicensePathFromWS(webTargetMock);
    
            //assertions here
        }

目前我得到空指针在线:
Response response = target.request().header(AUTHORIZATION, getAuthorizationToken()).get();即使我在嘲笑WebTarget。有人能指出我是否遗漏了什么吗?
谢谢

2guxujil

2guxujil1#

解决方案非常简单,而且可能难以理解,因为错误日志没有足够的详细信息。

when(builderMock.header(ArgumentMatchers.anyString(), ArgumentMatchers.anyString())).thenReturn(builderMock);

有一个anyString()作为第二个参数,但实际的方法需要一个对象。

when(builderMock.header(ArgumentMatchers.anyString(), ArgumentMatchers.any())).thenReturn(builderMock);

这也适用于旧版本:

when(builderMock.header(ArgumentMatchers.anyString(), ArgumentMatchers.anyObject())).thenReturn(builderMock);

相关问题