使用javax.ws.rs.client对inputStream进行Java写测试



我有一个使用java.ws.rs的GET api,如下所示:

@GET
@Produces(MediaType.APPLICATION_OCTET_STREAM)
public Response getMyFile() throws AbsoluteException {
StreamingOutput outputStream;
Client client = ClientBuilder.newClient();
try {
final InputStream responseStream = client.target(myFileUrl).request().get(InputStream.class);
outputStream = new StreamingOutput() {
@Override
public void write(OutputStream out) throws IOException {
int length;
byte[] buffer = new byte[downloadBufferSize];
while ((length = responseStream.read(buffer)) != -1) {
out.write(buffer, 0, length);
}
out.flush();
responseStream.close();
}
};
} catch (Exception ex) {
}
return Response
.ok(outputStream, MediaType.APPLICATION_OCTET_STREAM)
.header("content-disposition", "attachment; filename = " + myFile)
.build();
}

我不知道如何使用Mockito或任何其他软件为它编写unitTest。我的测试方法如下,但它不起作用:

@Test
public void getMyFile_Success() throws IOException {
final Client mockClient = Mockito.mock(Client.class);
final File initialFile = new File("src/test/resources/TestFile.txt");
final InputStream targetStream =
new DataInputStream(new FileInputStream(initialFile));
Mockito.when(mockClient.target("myUrl")
.request().get(InputStream.class))
.thenReturn(targetStream);
Invocation.Builder request = target(CONTEXT_ROOT).request();
Response response = request.get(Response.class);
assertThat(response.getStatus()).isEqualTo(Response.Status.OK.getStatusCode());
}

我成功地使用了powermock,它能够模拟构造函数和静态方法。以下是我的代码:

Client mockClient = Mockito.mock(Client.class); 
@Before
public void initMocks() {
MockitoAnnotations.initMocks(this);
PowerMockito.mockStatic(ClientBuilder.class);
PowerMockito.when(ClientBuilder.newClient()).thenReturn(this.mockClient);
}   
public void getMyFile_Success() throws Exception {
Invocation.Builder myBuilder = Mockito.mock(Invocation.Builder.class);
WebTarget webTarget = Mockito.mock(WebTarget.class);
Mockito.when(mockClient.target(myUrl)).thenReturn(webTarget);
Mockito.when(webTarget.request()).thenReturn(myBuilder);
final File initialFile = new File("src/test/resources/TestFile.txt");
InputStream targetStream =
new DataInputStream(new FileInputStream(initialFile));
Mockito.when(myBuilder
.get(InputStream.class))
.thenReturn(targetStream);
Invocation.Builder request = target(CONTEXT_ROOT).request();
Response response = request.get(Response.class);
assertThat(response.getStatus()).isEqualTo(Response.Status.OK.getStatusCode());
}   

最新更新