java - 在 Arquillian 测试期间清理数据库

标签 java mongodb testing morphia jboss-arquillian

我目前正在为我编写的一些 REST-full 服务编写测试。我正在测试的服务是用 Java 编写的,并使用 MongoDb/Morphia。测试调用服务,其中一些服务又写入测试集合。我需要在测试后清理并删除我注入(inject)的数据。解决此问题的最佳方法是什么?

这是我的一项简单服务的示例:

package org.haib.myerslab.services;

@Path("/database")
public class DatabaseService {
    @Inject
    private Datastore ds;

    @Path("/genre/")
    @POST
    @Produces("application/json")
    public GenreDTO postFromGenreDTO(@Context UriInfo uri, GenreDTO form) throws ParseException {
        Genre myNewGenre = DtoToDomainMapper.gerneFromGenreDTO(form);
        myNewGenre.setId(form.getId());
        ds.save(myNewGenre);
        return new GenreDTO(myNewGenre);
    }
}       

这是我的 Arquillian 测试示例:

@RunWith(Arquillian.class)
public class GeneTest {
    private static String myId = "myGenreId";
    private static String myGenre = "myGenre";
    private static String myGenreInfo = "myGenreInfo";

    @Deployment
    public static WebArchive getDeployment() {
        return TestHelper.getDeployment();
    }

    @Test
    @RunAsClient
    @InSequence(1)
    public void canPostGenre(@ArquillianResource URL baseURL) throws Exception {
        GenreDTO newGenre = new GenreDTO();
        newGenre.setGenre(myGenre);
        newGenre.setGenreInfo(myGenreInfo);
        newGenre.setId(myId);

        String url = baseURL.toURI().resolve("/database/genre/").toString();
        JsonNode rootNode = TestHelper.postUrl(url, newGene);

        assertEquals(myGenre,     rootNode.get("genre").asText());
        assertEquals(myGenreInfo, rootNode.get("genreInfo").asText());
        assertEquals(myId,        rootNode.get("id").asText());
    } 
}

getDeployment 函数如下所示:

public static WebArchive getDeployment() {
    File[] depend = Maven.resolver().loadPomFromFile("pom.xml").importRuntimeDependencies().resolve().withTransitivity().asFile();
    WebArchive war = ShrinkWrap.create(WebArchive.class).addClass(TestHelper.class)
        .addClass(Genre.class).addClass(Application.class).addPackage("org/haib/myerslab")
        .addPackage("org/haib/myerslab/database").addPackage("org/haib/myerslab/genre")
        .addPackage("org/haib/myerslab/dto").addPackage("org/haib/myerslab/dto/genre")
        .addAsLibraries(depend).addAsWebInfResource("jboss-deployment-structure.xml")
        .addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml").setWebXML("test-web.xml");
    return war;
}

所以我迷路的地方是,在 @After 中注入(inject)数据库的最佳方法是什么,并清除我发布到其中的流派类,这样我的下一个测试就没有它了。 我应该怎么做?还有别的办法吗?

最佳答案

看看nosql-unit .它提供注释和规则,可帮助您播种数据集、比较预期和清理 MongoDB。

要在执行测试之前让您的 MongoDB 进入原始状态,您可以简单地使用以下带有“CLEAN_INSERT”的注释:

@UsingDataSet(locations="my_data_set.json", loadStrategy=LoadStrategyEnum.CLEAN_INSERT) 
public void canPostGenre() { ...}

如果您需要更强大的 MongoDB 集成测试生命周期行为,您也可以基于 nosql-unit 的思想推出自己的行为。还要确保 checkout Junit Rules .

关于java - 在 Arquillian 测试期间清理数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24498739/

相关文章:

Selenium 脚本不工作异常

internet-explorer - 如何对检测浏览器的 JavaScript 函数进行单元测试?

testing - 在 telerik test studio 中单击客户文本 block 的代码

java - 从字符串的值查找对象的类型

java - 如何调用线程在java中的特定时间运行?

java - 如何在每个回收器 View 项内单击按钮时实现文本计数器

javascript - 将图像路径保存到mongodb的方式是什么?

mongodb - 在 Mongodb/pymongo 中按字符串长度排序

java - Spring Boot 异常 "java.lang.IllegalArgumentException: Not a managed type:"

mongodb - mongoDB中每条记录的字段之间的多对多数据建模