使用Jersey Rest测试框架和Mockito进行unit testing

有人可以帮我这个吗? 我正在使用Jersey rest测试框架版本2.21为Rest资源编写unit testing。(在Grizzly容器上)。

当我调试测试类时,我看到myManager的模拟对象。 但是当调试进入我的“MyResouce类”时,myManager对象变为null并获得NullPointerexception。

尝试过不同的人提供的解决方案,但没有运气。有人可以帮助我。 我差不多三天就遇到了这个问题。 🙁

我的资源类是这样的。

@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); } } 

这是我的测试类

 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上下文中查找服务。 这就是为什么它是null,因为你没有在spring上下文中设置mock。

最好的办法是使用构造函数注入(而不是字段注入)。 这使得测试变得更加容易

 @Path(..) public class MyResource { private final MyManager manager; @Autowired public MyResource(MyManager manager) { this.manager = manager; } } 

然后在你的测试中

 return new ResourceConfig() .register(new MyResource(myManager));