Java 使用Mockito和Junit模拟Jersey客户端请求响应
我在论坛上搜索了一下,试图通过试验其他人在其他相关帖子中已经提到的内容来获得一些启发,但由于我是mockito junit的新手,所以没有任何效果,因此我发布了这个问题 我有一个rest客户端,它调用rest webservice:-Java 使用Mockito和Junit模拟Jersey客户端请求响应,java,junit,mockito,jersey-client,Java,Junit,Mockito,Jersey Client,我在论坛上搜索了一下,试图通过试验其他人在其他相关帖子中已经提到的内容来获得一些启发,但由于我是mockito junit的新手,所以没有任何效果,因此我发布了这个问题 我有一个rest客户端,它调用rest webservice:- // Rest Client code public static String getProcessString(String url) { Client client = Client.create(); com.sun.jersey.api.client.W
// Rest Client code
public static String getProcessString(String url) {
Client client = Client.create();
com.sun.jersey.api.client.WebResource webResource = client.resource(url);
webResource.accept("application/json");
/*if (response.getStatus() != 200) {
throw new RuntimeException("Failed : HTTP error code : "
+ response.getStatus());
}*/
String process = webResource.get(String.class);
return process;
}
我的计划是对getProcessString(字符串url)方法进行单元测试。我的RestClientUnitTest.java代码如下所示:-
package......service.workflow.client;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.doReturn;
import junit.framework.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.WebResource;
@RunWith(MockitoJUnitRunner.class)
public class RestClientUnitTest {
@InjectMocks
private RestClient RestClient = new RestClient();
@Mock
private com.sun.jersey.api.client.WebResource res;
@Mock
private Client client;
private String URL = "http://localhost:9095/jersey/recoveryservice/fetchUpdateProcesses?oldProcessDefinitionId=maker_checker&newProcessDefinitionId=maker_checker_v1";
@Before
public void setUp() throws Exception {
Client mockClient = Client.create();
doReturn(mockClient).when(client).create();
//WebResource webResource = mockClient.resource(URL);
doReturn(webResource).when(mockClient).resource(URL);
//when(mockClient.resource(URL)).thenReturn(res);
doReturn("OK").when(res).get((Class<String>) any());
//when(webResource.get((Class<String>) any())).thenReturn("OK");
}
@Test
public void testgetProcessString() {
Assert.assertEquals(RestClient.getProcessString("http://localhost:9095/jersey/recoveryservice/fetchUpdateProcesses?oldProcessDefinitionId=maker_checker&newProcessDefinitionId=maker_checker_v1"), "OK");
/*Client client = Client.create();
com.sun.jersey.api.client.WebResource webResource = client.resource(url);
webResource.accept("application/json");
if (response.getStatus() != 200) {
throw new RuntimeException("Failed : HTTP error code : "
+ response.getStatus());
}
String process = webResource.get(String.class);
return process;*/
}
}
不知道我在这里错过了什么?如有任何意见和建议,将不胜感激
经过一些分析后,将setUp()方法中的代码调整为:-
Client mockClient =Client.create();
//WebResource mockWebResource = Mockito.mock(WebResource.class);
//when(client.create()).thenReturn(mockClient);
doReturn(mockClient).when(client).create();
res = mockClient.resource(URL);
when(res.get((Class<String>) any())).thenReturn("OK"); ---> Error
//stub(res.get((Class<String>) any())).toReturn("OK");
第一个错误日志:它告诉您应该如何使用API:
E.g. thenReturn() may be missing.
Examples of correct stubbing:
when(mock.isOk()).thenReturn(true);
第二个错误是:调用Client mockClient=Client.create()代码>这不是模拟,而是调用一个真正的方法
这是你应该做的:
//First you create a mock with an annotation
@Mock
private Client clientMock;
// ...
// Then you define special behaviour, e.g.
when(clientMock.foo()).thenReturn("bar");
// Then you use the mock instance:
assertEquals("bar", clientMock.foo());
但是,您正在模拟Jersey的客户端
,但是您没有将模拟的实例设置为RestClient
,因此它使用的是真实的实例。要么向RestClient
引入一个setter来设置Client
实例(这不是很好),要么变得更加复杂和模拟Client.create()。相反,您可以查看(使用Mockito;它仍然有一些限制)或(这是一个完整而强大的模拟框架,但文档非常简短)谢谢您的回复@Andy。。非常感谢。。是的,我同意您的看法,在Rest客户端中注入客户端实例可能涉及重构和更改大部分代码,这些代码将直接调用RestClient.java。因此,正如您所建议的,我正在尝试使用JMockit 0.991,因为它仅在我们公司的全公司maven repo中可用。无论如何,我会让你了解我的最新进展。再次感谢
E.g. thenReturn() may be missing.
Examples of correct stubbing:
when(mock.isOk()).thenReturn(true);
//First you create a mock with an annotation
@Mock
private Client clientMock;
// ...
// Then you define special behaviour, e.g.
when(clientMock.foo()).thenReturn("bar");
// Then you use the mock instance:
assertEquals("bar", clientMock.foo());