Arquillian + mvn clean package 而不是 mvn clean package -DskipTests 和 mvn test

Arquillian + mvn clean package instead of mvn clean package -DskipTests and mvn test

我正在学习 Arquillian,但遇到了问题。

我的测试只有在我首先使用 mvn clean package -DskipTests 生成 war 然后使用 mvn test 命令执行测试时才有效。

如果我执行 mvn clean package 然后我得到一个异常并且我的测试没有被执行:

java.lang.RuntimeException: Could not invoke deployment method: public static org.jboss.shrinkwrap.api.spec.WebArchive a.b.c.HelloBeanTest.createDeployment()
    at a.b.c.HelloBeanTest.createDeployment(HelloBeanTest.java:32)

如果我可以直接执行我的测试而无需首先生成最终工件,那就太好了。

这是我的测试class:

@RunWith(Arquillian.class)
public class HelloBeanTest {
    @EJB
    private HelloBean bean;

    @Deployment
    public static WebArchive createDeployment() {
        WebArchive war = ShrinkWrap.createFromZipFile(
                WebArchive.class, new File("target/arquillian-demo-web-1.0.war")
        );

        System.out.println(war.toString(true));
        return war;
    }

    @Test
    public void testSay() throws Exception {
        assertNotNull(bean);
        System.out.println(bean.say());
        System.out.println("- end -");
    }

}

我试过呜呜声但它对我不起作用:

war = ShrinkWrap.create(MavenImporter.class).loadPomFromFile("pom.xml").importBuildOutput().as(WebArchive.class);

Arquillian 提供了一种更好的方法来做你想做的事。最佳实践是使用 ShrinkWrap maven importer 来构建和打包应用程序而不是 maven。

但在这样做之前,请三思,您是真的要测试整个应用程序(在集成或系统测试中),还是要对应用程序的较小部分或较大组件进行单元测试。最佳实践是始终只打包 运行 测试所需的整个应用程序的最小子集,仅此而已(这样更容易理解测试正在测试的内容,并且 运行s 更快).

如果您真的想在单个测试用例中测试整个应用程序,那么我上面提到的 ShrinkWrap maven importer 应该会有所帮助:

WebArchive war = ShrinkWrap.create(MavenImporter.class) 
    .loadPomFromFile("pom.xml").importBuildOutput().as(WebArchive.class);