Java 在Arquillian测试期间清理数据库
我目前正在为我编写的一些REST完整服务编写测试。我正在测试的服务是用Java编写的,并使用MongoDb/Morphia。这些测试调用这些服务,其中一些服务反过来会写入测试集合。我需要在测试之后清理并删除我注入的数据。最好的办法是什么 下面是我的一个简单服务的示例:Java 在Arquillian测试期间清理数据库,java,mongodb,testing,morphia,jboss-arquillian,Java,Mongodb,Testing,Morphia,Jboss Arquillian,我目前正在为我编写的一些REST完整服务编写测试。我正在测试的服务是用Java编写的,并使用MongoDb/Morphia。这些测试调用这些服务,其中一些服务反过来会写入测试集合。我需要在测试之后清理并删除我注入的数据。最好的办法是什么 下面是我的一个简单服务的示例: package org.haib.myerslab.services; @Path("/database") public class DatabaseService { @Inject private Data
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);
}
}
下面是我的阿奎利安测试的一个例子:
@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中注入数据库,然后清除我发布到其中的流派类,这样我的下一个测试就不会有它了。
我该怎么做?还有别的办法吗?看看。它提供注释和规则,帮助您设定数据集种子、比较期望值和清理MongoDB
要在执行测试之前让MongoDB进入原始状态,只需使用以下注释和“CLEAN_INSERT”:
@UsingDataSet(locations="my_data_set.json", loadStrategy=LoadStrategyEnum.CLEAN_INSERT)
public void canPostGenre() { ...}
如果您需要在MongoDB的集成测试生命周期中实现更强大的行为,您也可以基于nosql单元的思想推出自己的产品。另外,请务必查看。+1,很高兴看到有人正在寻找集成测试的良好实践。