我正在尝试使用Arquillian进行一些单元测试,但是我无法找到使用Maven部署时失败的原因.
这是班级考试:
package com.ndeveloper.spec.test;
import javax.inject.Inject;
import junit.framework.Assert;
import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.shrinkwrap.api.ArchivePaths;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.asset.ByteArrayAsset;
import org.jboss.shrinkwrap.api.spec.JavaArchive;
import org.junit.Test;
import org.junit.runner.RunWith;
import com.ndeveloper.spec.controller.GreetingBean;
@RunWith(Arquillian.class)
public class GreetingBeanTest {
@Inject
GreetingBean greetingBean;
@Deployment
public static JavaArchive createTestArchive()
{
return ShrinkWrap.create( JavaArchive.class,"test.jar").
addClass(GreetingBean.class).addAsManifestResource(
new ByteArrayAsset("<beans/>".getBytes()),
ArchivePaths.create("beans.xml"));
}
@Test
public void testInjection(){
Assert.assertEquals("Hello World", greetingBean.getGreeting());
}
}
Run Code Online (Sandbox Code Playgroud)
我正在使用jboss jboss-javaee6-webapp原型.奇怪的是,最初的测试工作得很好......但是使用了几次之后.出现以下错误:
测试错误:com.ndeveloper.spec.test.GreetingBeanTest:无法获取MBeanServerConnect:service:jmx:rmi:/// jndi/rmi://127.0.0.1:1090/jmxrmi
万无一失的报告说如下:
-------------------------------------------------------------------------------
Test set: com.ndeveloper.spec.test.GreetingBeanTest
-------------------------------------------------------------------------------
Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 1.309 sec …Run Code Online (Sandbox Code Playgroud) 我想在同一个JUnit 4测试中使用Arquillian和PowerMock的功能.
问题是两个产品都是Runner应该使用的JUnit @RunWith,并且不可能@RunWith在同一个测试类上使用多个,或者将多个Runners类放在同一个@RunWith注释中.
你知道怎么办?
我有Java EE项目,我在JBoss 7(Windows)上使用JUnit进行Arquillian测试.测试工作正常,但我无法调试它们.
从我用Google搜索(https://community.jboss.org/wiki/WhyDontBreakPointsWorkWhenDebugging)我知道Arquillian测试正在单独的VM中运行,因此IntelliJ无法调试它们.我需要IntelliJ通过socket远程连接到那台机器,但我不知道该怎么做.
我找到了这个帖子:在IntelliJ中使用Arquillian进行调试 - 托管容器但是我不知道如何让它工作.
我也跨过了这个帖子:http://devnet.jetbrains.com/message/5253623?tstart = 0所以我希望在我的pom.xml中填充appropriet surefire部分,但它没有帮助:
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.4.3</version>
<configuration>
<debugForkedProcess>true</debugForkedProcess>
<skip>false</skip>
</configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)
请问有人如何在这样的配置中调试测试吗?
我正试图从Arquillian的另一个maven项目中部署现有的战争.我已经解决了战争并将其复制到我的Arquillian项目的目标目录中.
我尝试在下面创建它:
@Deployment
public static WebArchive createDeployment() {
return (WebArchive) ShrinkWrap.create(ZipImporter.class, "MyWarToTest.war").importFrom(
new File("target/MyWarToTest.war"));
}
Run Code Online (Sandbox Code Playgroud)
但是,我得到了一个类强制转换异常.
引起:java.lang.ClassCastException:org.jboss.shrinkwrap.impl.base.importer.zip.ZipImporterImpl无法强制转换为org.jboss.shrinkwrap.api.Archive
我猜我应该尝试以不同的方式创造战争?
我使用Arquillian来测试具有显式本地和远程接口的无状态会话bean.但是在测试中,Arquillian不会在具有本地接口类型的字段中"注入"任何内容,但它适用于远程接口.
@Stateless
public class TestServiceImpl implements TestServiceLocal, TestServiceRemote {
public String greet() {
return "hallo";
}
}
Run Code Online (Sandbox Code Playgroud)
远程接口:
@Remote
public interface TestServiceRemote {
public String greet();
}
Run Code Online (Sandbox Code Playgroud)
语言环境界面:
@Local
public interface TestServiceLocal {
public String greet();
}
Run Code Online (Sandbox Code Playgroud)
这是测试:
@RunWith(Arquillian.class)
public class GenericEntityDaoEjbIntegrationTest {
@Deployment
public static JavaArchive createTestArchive()
throws UnsupportedEncodingException {
return ShrinkWrap.create(JavaArchive.class, "test.jar")
.addClasses(
TestServiceLocal.class,
TestServiceRemote.class,
TestServiceImpl.class);
}
@EJB
private TestServiceLocal testServiceLocal;
@EJB
private TestServiceRemote testServiceRemote;
//Will Fail
@Test
public void testTestServiceLocal() {
assertNotNull(this.testServiceLocal);
}
//Success
@Test
public void …Run Code Online (Sandbox Code Playgroud) 我们有一个Java EE 7应用程序并使用Arquillian来测试东西.现在我们要检查当前登录用户的一些权限.我的问题很基本,如何在测试用例中登录用户?我读过ProgrammaticLogin在arquillian测试和嵌入式Glassfish,安全性和Arquillian问题上都没有用,但是没有明确回答.我目前的做法是这样的:
// Inject services etc.
@Test
public void testLogin(){
UserAccount user = new UserAccount();
user.setUsername("bob");
user.setPassword("bob");
userAccountService.save(user);
ProgrammaticLogin pl = new ProgrammaticLogin();
String realmName = "secureJDBCRealm";
try {
pl.login("bob", "bob".toCharArray(), realmName, true);
} catch (Exception e){
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
现在当我尝试运行它时,得到一个LoginException,声称我没有为"fileRealm"配置LoginModule.但是"fileRealm"不是我正在寻找的领域(我把它放在那里进行第一次测试,但后来我将其改为"secureJDBCRealm",这是我们为GlassFish定制的安全领域).我们arquillian-glassfish-embedded-3.1用于测试.
我需要这个进行集成测试.我的环境是JBoss 7,在Hibernate 4上使用JPA的EJB3,H2内存数据库和测试由Arquillian运行.我希望能够删除数据库并再次创建它将基于所有表persistence.xml和实体.我知道我可以在应用程序开始时通过指定:
<property name="hibernate.hbm2ddl.auto" value="create-drop" />
Run Code Online (Sandbox Code Playgroud)
但是我需要在第一次删除后从代码中手动执行此操作并创建发生.
可能吗?什么是最简单的方法?
我在我的pom.xml中有以下配置
<build>
<plugins>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.17</version>
<configuration>
<excludes>
<exclude>**/DocumentChangeSubscriberTest.java</exclude>
</excludes>
</configuration>
</plugin>
(...)
Run Code Online (Sandbox Code Playgroud)
DocumentChangeSubscriberTest是一个arquillian测试,我想只在指定的配置文件中运行.当我键入mvn install所有测试时,即使DocumentChangeSubscriberTest我想要排除.如何从默认(匿名)配置文件中排除测试?
我试过<includes><include>...,它工作正常 - 只包括测试运行.
我看到maven surefire测试插件运行测试,即使它们被排除在外:但这对我不起作用.我也试过很多maven-surefire-plugin没有结果的版本.有任何想法吗?
我正在使用Arquillian和使用TestNG的嵌入式glassfish 3.1.2.2编写集成测试.我希望能够并行运行这些测试,对于这种情况,我需要动态配置glassfish端口和数据库名称(我们已经有了这个设置,我想重用它的arquillian测试).我缺少的是一个'before container start'钩子,在那里我可以准备数据库,查找空闲端口并更新我的glassfish配置(domain.xml,也可以是glassfish-resources.xml).是否有一个"干净"的解决方案,或Arquillian开发人员没有预见到我的用例?
我目前解决它的hacky方法是覆盖arquillian的beforeSuite方法,但是这个方法被调用两次 - 在测试启动时然后在容器中(因此我可怜的静态标志).其次,这个解决方案不适用于基于JUnit的测试,因为在套件之前无法拦截arquillian:
public class FullContainerIT extends Arquillian {
private static boolean dbInitialized;
//@RunAsClient <-supported by @Test only
@Override
@BeforeSuite(groups = "arquillian", inheritGroups = true)
public void arquillianBeforeSuite() throws Exception {
if (dbInitialized == false) {
initializeDb();
dbInitialized = true;
}
super.arquillianBeforeSuite();
}
}
Run Code Online (Sandbox Code Playgroud)
我有一些想法:
+ @BeforeSuite @RunAsClient似乎是我需要的,但@RunAsClient仅支持@Test;
+我org.jboss.arquillian.container.spi.event.container.BeforeStart在Arquillian JavaDocs中看过事件 ,但我不知道如何听Arquillian事件;
+我已经看到有可能@Deployment创建一个ShrinkWrap描述符,但这些不支持Glassfish资源.
我们正在从使用带有嵌入式JBoss的TestNG过渡到使用带有远程服务器的Arquillian.
我们正在运行一个简单的测试,它有一个用@BeforeClass注释的方法,可以进行一些测试设置.经过大量挖掘后,看起来安装方法被调用了两次:一次是在我们执行Maven命令的控制台上运行测试,再次将测试战部署到我们的远程服务器并运行测试时.这是两个独立的JVMS - 一个在容器外运行,另一个在容器内运行.我倾向于让后者运行.
这是我应该期待的行为还是我可能会遗漏的东西?
现在,我们实际上正在检查我们是否在容器中,如果是,我们运行我们的设置代码.这有效,但我想知道是否有更好的方法.
我们的代码的一些片段(请忽略代码的简单性以及这里不需要setupComponents方法的事实,我们正在迁移需要此功能的更复杂的测试):
public class BaseTest extends Arquillian
{
private static Log log = LogFactory.getLog( SeamTest.class );
@Deployment
public static Archive<?> createDeployment()
{
// snip... basically, we create a test war here
}
/**
* todo - there might be a better way to do this
*/
private boolean runningInContainer()
{
try
{
new InitialContext( ).lookup( "java:comp/env" );
return true;
}
catch (NamingException ex)
{
return false;
}
}
@BeforeClass
public void setupOnce() throws Exception
{ …Run Code Online (Sandbox Code Playgroud)