使用Spring的JPRING的Jinge-in-memory database的Jage e2e集成测试

为泽西岛 REST API 设计和运行 e2e 集成测试的正确方法是什么,该 API 使用 、 h2 数据库和 ?jersey-test-framework-provider-inmemoryorg.springframework.jdbc.core.JdbcTemplate

要求:

测试范围应该是端到端的:从资源开始,通过所有应用程序到h2数据库

编写测试:

目前,如果从IDE的JUnit一起运行,我的JUnit集成测试将失败,主要是因为它们相互干扰(与JUnit同时运行)。另一个问题是那些应该在每次测试后回滚,使用事务支持(目前注释没有任何帮助)。支持这种测试所需的Spring工具的最小集合是什么?如何使它工作?应该放在其他任何地方吗?@Transactional@Transactional

例:

@Transactional
public class OrderResourceIT extends JerseyTest {

    @Override
    protected Application configure() {
        // config
    }

    @Override
    protected void configureClient(final ClientConfig config) {
        // config
    }

    @Before
    public void startUp(){
        // database bootstrap programmatically before each test
    }


    @Test
    @Transactional
    public void testGetOrders(){
        Response response  = target("/orders")
                .request()
                .get();

        List<Order> orders = response.readEntity(new GenericType<List<Order>>(){});

        // asserts
    }
}

执行:

它计划通过以下方式执行:maven-failsafe-plugin

故障安全插件文档建议将容器绑定到容器终止时和在容器终止时。如果我的容器是以编程方式配置的,如何配置?示例pre-integration-test phasepost-integration-testjersey-container-grizzly2-http

public class Main {
    // Base URI the Grizzly HTTP server will listen on
    public static final String BASE_URI = "http://localhost:8080/myapp/";

    public static HttpServer startServer() {
        // create a resource config that scans for JAX-RS resources and providers
        // in com.example.rest package
        final ResourceConfig rc = new ResourceConfig().packages("com.example.rest");

        // create and start a new instance of grizzly http server
        // exposing the Jersey application at BASE_URI
        return GrizzlyHttpServerFactory.createHttpServer(URI.create(BASE_URI), rc);
    }

    public static void main(String[] args) throws IOException {
        final HttpServer server = startServer();
        System.out.println(String.format("Jersey app started with WADL available at "
                + "%sapplication.wadl\nHit enter to stop it...", BASE_URI));
        System.in.read();
        server.stop();
    }
}

看到工作示例代码将是完美的。


答案 1

我认为您的方案非常适合 dbunit 测试。使用 dbunits,将为要执行的每个测试用例生成一个内存中数据库,并在测试用例执行完成时销毁。此数据库的数据模型完全取决于您配置的数据集 xml。看看这个:http://archive.oreilly.com/pub/post/dbunit_made_easy.html


答案 2

嗨,有大量的例子由球衣提供作为球衣的例子。托管其余服务的每个模块都有一组 junit 测试用例。

该示例可以从球衣下载页面下载。https://jersey.java.net/download.html

下面给出了确切的链接,这些链接将来可能会发生变化。

对于所有可用版本:

http://repo1.maven.org/maven2/org/glassfish/jersey/bundles/jersey-examples

对于当前最新版本:

http://repo1.maven.org/maven2/org/glassfish/jersey/bundles/jersey-examples/2.23.1/jersey-examples-2.23.1-all.zip


推荐