使用Jersey Test,Grizzly和HK2依赖注射进行功能测试

时间:2016-07-14 22:11:26

标签: java unit-testing jersey-2.0 hk2 jersey-test-framework

我正在尝试使用Jersey Test框架为我的REST API编写功能测试。但是,在我的功能测试中使用依赖注入时,我似乎遇到了障碍。我的主要应用程序如下所示:

@ApplicationPath("/")
public class Application extends ResourceConfig {

    private static final URI BASE_URI = URI.create("http://localhost:8080/api/");

    public static void main(String[] args) throws Exception {
        System.out.println("Starting application...");

        final ServiceLocator locator = ServiceLocatorUtilities.createAndPopulateServiceLocator();

        final ResourceConfig resourceConfig = new ResourceConfig();
        resourceConfig.register(JacksonFeature.class);
        resourceConfig.register(LoggingFeature.class);
        resourceConfig.packages(true, "my.package.name");

        final HttpServer server = GrizzlyHttpServerFactory.createHttpServer(BASE_URI, resourceConfig, locator);

        Runtime.getRuntime().addShutdownHook(new Thread(server::shutdownNow));

        server.start();

        Thread.currentThread().join();
    }
}

请注意,我正在使用HK2的ServiceLocatorUtilities.createAndPopulateServiceLocator()方法来阅读hk2-metadata-generator文件。此方法创建一个ServiceLocator对象,然后将其传递给GrizzlyHttpServerFactory.createHttpServer方法。这对于运行Grizzly服务器非常有用,但是,我现在的问题是如何使用Jersey测试框架为我的应用程序创建功能测试?

我的单元测试目前看起来像这样:

public class FormsResourceTest extends JerseyTest {

    @Override
    protected TestContainerFactory getTestContainerFactory() throws TestContainerException {
        return new GrizzlyWebTestContainerFactory();
    }

    @Test
    public void testMe() {
        Response response = target("/test").request().get();
        assertEquals("Should return status 200", 200, response.getStatus());
    }

}

是否有办法将HK2服​​务定位器与Jersey Test框架一起使用,或者我是否需要将我的应用程序视为外部容器并使用外部容器提供程序,如下所示:External container

此外,由于这些都是功能测试,因此在这里不能选择模拟注入的服务。

1 个答案:

答案 0 :(得分:0)

您可以使用Locator Bridge获取两个单独的定位器(您创建的定位器和来自Jersey的定位器)并将它们连接在一起。桥也可以是双向的(在限制范围内),因此它在大多数正常使用中都会出现一个大的ServiceLocator。

请注意,本周使用ServiceLocator桥修复了一个错误,该错误尚未被推送到maven但是(可能)将在下周的某个时间推送。见HK2-295