使用Guice注入字段对泽西资源进行单元测试

min*_*ate 5 java junit jersey guice

我有一个泽西资源,我想用JUnit测试.该资源使用Guice Providers注入某些字段:

@Path("/example/")
class ExampleResource {
    @Inject
    Provider<ExampleActionHandler> getMyExampleActionHandlerProvider;

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public List<ExamplePojo> getExampleList() {
        ExampleActionHandler handler = getMyExampleActionHandlerProvider.get();
        handler.doSomething();
    ...
Run Code Online (Sandbox Code Playgroud)

当使用真实服务器为API提供服务时,这一切都很有效,但测试它是有问题的.

我的测试类目前看起来像:

public class ApiTest extends JerseyTest {

  public ApiTest() throws Exception {
    super();
    ApplicationDescriptor appDescriptor = new ApplicationDescriptor();
    appDescriptor.setContextPath("/api");
    appDescriptor.setRootResourcePackageName("com.my.package.name");
    super.setupTestEnvironment(appDescriptor);
  }

  @Test
  public void testHelloWorld() throws Exception {
    String responseMsg = webResource.path("example/").get(String.class);
    Assert.assertEquals("{}", responseMsg);
  }
}
Run Code Online (Sandbox Code Playgroud)

显然,Guice没有机会初始化字段,ExampleResource因此handler.doSomething()调用不会导致NullPointerException.

有没有办法告诉Jersey使用Guice实例化ExampleResource类,以便提供程序工作?

Eis*_*ith 0

一种方法是将测试分解为几个步骤。您需要创建用于配置服务的注入器并测试该注入器(请参阅测试 Guice Servlet 绑定测试 Guice 可以初始化 servlet)。使用这些测试可以确保您拥有正确的绑定。获得注入器后,使用以下命令从中获取 ApplicationDescriptor 对象

ExampleResource exampleResource = injector.getInstance(ExampleResource.class);
Assert.assertEquals(myList, getExampleList());
Run Code Online (Sandbox Code Playgroud)