嘲弄JAX RS客户端响应



我正在学习如何进行单元测试。我有一个使用jax-rs客户机调用外部服务的方法。我试图模拟从jax-rs客户端收到的响应,但我得到NullPointerException。有人能帮我解决这个问题吗?

我的业务类和我正在尝试单元测试的方法。

@Stateless
public class SinglePaymentManager {
private JAXRSClientWrapper httpClient;
private Client client;
public SinglePaymentManager() {
}
@Inject
public SinglePaymentManager(JAXRSClientWrapper httpClient) {
this.httpClient = httpClient;
this.client = httpClient.createClient(true);
}
public BankResponse initiatePayment(PaymentContext paymentContext) {
// Extracting data from parameters
Invocation.Builder invocationBuilder = client.target(uri)
.request()
// more headers
.header("content-type", MediaType.APPLICATION_JSON);
String responseAsString;
Response.Status responseStatus;
try (Response response = invocationBuilder.post(Entity.json(payload))) {
responseAsString = response.readEntity(String.class);
responseStatus = response.getStatusInfo().toEnum();
}
return new BankResponse(responseStatus, responseAsString);
}

我的测试类


public class SinglePaymentManagerTest {
private final String responseAsString = //expected response;
private final Response.Status responseStatus = Response.Status.CREATED;
private final JAXRSClientWrapper mockHTTPClient = mock(JAXRSClientWrapper.class);
private final Client mockClient = mock(Client.class);
private final WebTarget mockWebTarget = mock(WebTarget.class);
private final Invocation.Builder mockBuilder = mock(Invocation.Builder.class);
private final Response mockResponse = mock(Response.class);
@Test
public void testSomeMethod() {
when(mockHTTPClient.createClient(true)).thenReturn(mockClient);
SinglePaymentManager manager = new SinglePaymentManager(mockHTTPClient);
when(mockClient.target(anyString())).thenReturn(mockWebTarget);
when(mockWebTarget.request()).thenReturn(mockBuilder);
when(mockBuilder.header("accept", MediaType.APPLICATION_JSON)).thenReturn(mockBuilder);
when(mockBuilder.post(any(Entity.class))).thenReturn(mockResponse);
when(mockResponse.readEntity(any(Class.class))).thenReturn(responseAsString);
when(mockResponse.getStatusInfo().toEnum()).thenReturn(responseStatus); // this is where I get NullPointer

//requestData and bank object creation is omitted for brevity        
PaymentContext context = new PaymentContext(requestData, bank);
BankResponse response = new BankResponse(responseStatus, responseAsString);
BankResponse serviceResponse = manager.initiatePayment(context);
Assertions.assertEquals(response, serviceResponse);
}
}

来自POM.xml的依赖项

<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.6.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<version>5.6.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.6.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>4.5.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-junit-jupiter</artifactId>
<version>4.5.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>8.0</version>
<scope>provided</scope>
</dependency>
</dependencies>

我终于找到了解决办法。

when(mockResponse.getStatusInfo()).thenReturn(Response.Status.CREATED);

一行我只是删除了getStatusInfo()和NullPointer消失。

最新更新