使用 Jersey Rest 测试框架和 Mockito 进行单元测试
Unit Testing with Jersey Rest Test Framework and Mockito
有人可以帮我解决这个问题吗?
我正在使用 Jersey rest 测试框架版本 2.21 为 Rest 资源编写单元测试。(在 Grizzly 容器上)。
当我调试测试 class 时,我看到了 myManager 的模拟对象。但是当调试进入我的“MyResouce class 时,myManager 对象变为 null 并出现 NullPointer Exception。
尝试过不同人提供的解决方案,但没有luck.Could请有人帮助我。我已经有将近三天的时间遇到这个问题了。 :(
我的资源class是这样的
@Component
@Path("/somepath")
public class MyResource {
@Autowired
private MyManager myManager;
@Path("/somepath")
@GET
@Produces("application/json")
@ResponseType(String.class)
public Response getResults(@QueryParam("queryParam") String number) {
// myManager is an interface
String str = myManager.getResult(number);
}
}
这是我的测试class
public class MyResourceTest extends JerseyTest {
@Mock
private MyManager myManager;
@InjectMocks
private MyResource myResource;
@Override
protected Application configure() {
MockitoAnnotations.initMocks(this);
return new ResourceConfig().register(MyResource.class)
.register(new AbstractBinder() {
@Override
protected void configure() {
bind(myManager).to(MyManager.class);
}
});
}
@Test
public void getResultsTest() {
when(myManager.getResult(anyString())).thenReturn(mock(String.class));
String str = target("path").queryParam("queryParam","10").request().get(String.class);
}
}
您正在使用 Spring(注入)注释,因此将从 spring 上下文中查找该服务。这就是它为空的原因,因为您尚未在 spring 上下文中设置模拟。
最好的办法是使用构造函数注入(而不是字段注入)。这使测试变得容易得多
@Path(..)
public class MyResource {
private final MyManager manager;
@Autowired
public MyResource(MyManager manager) {
this.manager = manager;
}
}
那么在你的测试中
return new ResourceConfig()
.register(new MyResource(myManager));
有人可以帮我解决这个问题吗? 我正在使用 Jersey rest 测试框架版本 2.21 为 Rest 资源编写单元测试。(在 Grizzly 容器上)。
当我调试测试 class 时,我看到了 myManager 的模拟对象。但是当调试进入我的“MyResouce class 时,myManager 对象变为 null 并出现 NullPointer Exception。
尝试过不同人提供的解决方案,但没有luck.Could请有人帮助我。我已经有将近三天的时间遇到这个问题了。 :(
我的资源class是这样的
@Component
@Path("/somepath")
public class MyResource {
@Autowired
private MyManager myManager;
@Path("/somepath")
@GET
@Produces("application/json")
@ResponseType(String.class)
public Response getResults(@QueryParam("queryParam") String number) {
// myManager is an interface
String str = myManager.getResult(number);
}
}
这是我的测试class
public class MyResourceTest extends JerseyTest {
@Mock
private MyManager myManager;
@InjectMocks
private MyResource myResource;
@Override
protected Application configure() {
MockitoAnnotations.initMocks(this);
return new ResourceConfig().register(MyResource.class)
.register(new AbstractBinder() {
@Override
protected void configure() {
bind(myManager).to(MyManager.class);
}
});
}
@Test
public void getResultsTest() {
when(myManager.getResult(anyString())).thenReturn(mock(String.class));
String str = target("path").queryParam("queryParam","10").request().get(String.class);
}
}
您正在使用 Spring(注入)注释,因此将从 spring 上下文中查找该服务。这就是它为空的原因,因为您尚未在 spring 上下文中设置模拟。
最好的办法是使用构造函数注入(而不是字段注入)。这使测试变得容易得多
@Path(..)
public class MyResource {
private final MyManager manager;
@Autowired
public MyResource(MyManager manager) {
this.manager = manager;
}
}
那么在你的测试中
return new ResourceConfig()
.register(new MyResource(myManager));