小编最近在使用Arquillian做EJB的单元测试工作,不妨在查一些资料,为什么选择Arquillian,以及它和其他内置容器之间的区别是什么,看到一篇,做一下总结。
原文链接:http://stackoverflow.com/questions/24310912/arquillian-vs-ejb-embeddable-container (来自“Stack Overflow”)
问:我在尝试理解由Java EE 6提供的对EJB容器进行单元测试的测试类和Arquillian之间的区别?
答:
(1)Arquillian是关于“集成测试”中一个model的组成。通过使用EJB容器,你会将这个容器(测试用例中的用到的那个)引入到你的测试当中。通过引入这个容器到你的测试中,你会添加复杂的配置文件。而Arquillian的哲学思想则恰恰相反,Arquillian做了相反的事情,它将你的test测试引入到所需的容器当中,并且它消除了测试隔阂(在集成测试和测试单元之间)。也许下面这个例子,你将明白二者之间的不同。
1、使用Arquillian的单元测试
@RunWith(Arquillian.class)
public class ArquillianGreeterTest {
@Deployment
public static JavaArchive createTestArchive() {
return ShrinbkWrap.create("greeterTest.jar", JavaArchive.class)
.addClasses(Greeter.class)
.addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
}
@EJB private Greeter greeter;
@Test
public void testGreeting() {
assertNotNull(greeter);
assertEquals("Welcome to the Arquillian Universe :)", greeter.greet());
}
}
2、使用EJB容器的单元测试
public class EJBContainerGreeterTest {
private static EJBContainer ejbContainer;
private static Context ctx;
@BeforeClass
public static void setUpClass() throws Exception {
ejbContainer = EJBContainer.createEJBContainer();
ctx = ejbContainer.getContext();
}
@AfterClass
public static void tearDownClass() throws Exception {
if (ejbContainer != null) {
ejbContainer.close();
}
}
@Test
public void testGreeting() {
Greeter greeter = (Greeter)
ctx.lookup("java:global/classes/Greeter");
assertNotNull(greeter);
assertEquals("Welcome to the Arquillian Universe :)", greeter.greet()) ;
}
}
由此可见,
另一个Answer:
Arquillian最终构建在这些ideas的上面,把它理解为一个空的占位符,一辆没有引擎的汽车。但是这辆车能够安装不同的引擎,例如:“GlassFishEngine, Jboss Engine, Websphere Engine. ”。
于是当你使用arquillina的时候,你由你自己选择来定制引擎,你可以在切换乘客(所要测试的代码)的同时,切换这辆车的引擎,并且开着它走,这就是Arquillian和其他EJB Container之间很大的区别之一。
(其实这里和我最近看的Arquillian官网上的切换应用服务器是在讲一件事情,下午也在和文彬整这个,代码可以参考如下):
<profiles>
<!-- weld容器 -->
<profile>
<id>arquillian-weld-ee-embedded</id>
<dependencies>
<dependency>
<groupId>org.jboss.spec</groupId>
<artifactId>jboss-javaee-6.0</artifactId>
<version>1.0.0.Final</version>
<type>pom</type>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.jboss.arquillian.container</groupId>
<artifactId>arquillian-weld-ee-embedded-1.1</artifactId>
<version>1.0.0.CR3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jboss.weld</groupId>
<artifactId>weld-core</artifactId>
<version>1.1.5.Final</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.6.4</version>
<scope>test</scope>
</dependency>
</dependencies>
</profile>
<!-- glassfish容器 -->
<profile>
<id>arquillian-glassfish-embedded</id>
<dependencies>
<dependency>
<groupId>org.jboss.arquillian.container</groupId>
<artifactId>arquillian-glassfish-embedded-3.1</artifactId>
<version>1.0.0.CR2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.glassfish.main.extras</groupId>
<artifactId>glassfish-embedded-all</artifactId>
<version>3.1.2</version>
<scope>provided</scope>
</dependency>
</dependencies>
</profile>
<!-- JBoss AS容器 -->
<profile>
<id>arquillian-jbossas-managed</id>
<dependencies>
<dependency>
<groupId>org.jboss.spec</groupId>
<artifactId>jboss-javaee-6.0</artifactId>
<version>1.0.0.Final</version>
<type>pom</type>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.jboss.as</groupId>
<artifactId>jboss-as-arquillian-container-managed</artifactId>
<version>7.1.1.Final</version>
<scope>test</scope>
</dependency>
</dependencies>
</profile>
</profiles>
链接:
http://arquillian.org/guides/getting_started_zh_cn/
Addition:关于集成测试(integration testing),可以参考这里(What's Integration Testing)