简体   繁体   English

如何在 JEE 中正确注入 EJB 并使用 Junit 使用 Arquillian 进行测试?

[英]How to inject with EJB correctly in JEE and test with Arquillian using Junit?

I am trying to run a EJB test using Arquillian and Junit, but getting this errror message when running command:我正在尝试使用 Arquillian 和 Junit 运行 EJB 测试,但在运行命令时收到此错误消息:

mvn test mvn 测试

that says:说的是:

No EJB found with interface of type 'ejb.ResetEjb' for binding ejb.CategoryEjbTest/resetEjb"}}找不到 EJB 类型为“ejb.ResetEjb”的接口用于绑定 ejb.CategoryEjbTest/resetEjb"}}

21:49:12,153 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-2) MSC000001: Failed to start service jboss.deployment.unit."test.war".INSTALL: org.jboss.msc.service.StartException in service jboss.deployment.unit."test.war".INSTALL: WFLYSRV0153: Failed to process phase INSTALL of deployment "test.war" at org.jboss.as.server@10.0.3.Final//org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:183) at org.jboss.msc@1.4.11.Final//org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1739) at org.jboss.msc@1.4.11.Final//org.jboss.msc.service.ServiceControllerI 21:49:12,153 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-2) MSC000001: Failed to start service jboss.deployment.unit."test.war".INSTALL: org.jboss.msc .service.StartException 在服务 jboss.deployment.unit."test.war".INSTALL: WFLYSRV0153: 在 org.jboss.as.server@0.F 处理部署“test.war”的阶段安装失败org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:183) at org.jboss.msc@1.4.11.Final//org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl. java:1739) 在 org.jboss.msc@1.4.11.Final//org.Z9764DC122BE894C72F6314703587F.serviceController.ServiceController mpl$StartTask.execute(ServiceControllerImpl.java:1701) at org.jboss.msc@1.4.11.Final//org.jboss.msc.service.ServiceControllerImpl$ControllerTask.run(ServiceControllerImpl.java:1559) at org.jboss.threads@2.3.3.Final//org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35) at org.jboss.threads@2.3.3.Final//org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1982) at org.jboss.threads@2.3.3.Final//org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1486) at org.jboss.threads@2.3.3.Final/ mpl$StartTask.execute(ServiceControllerImpl.java:1701) at org.jboss.msc@1.4.11.Final//org.jboss.msc.service.ServiceControllerImpl$ControllerTask.run(ServiceControllerImpl.java:1559) at org.jboss .threads@2.3.3.Final//org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35) at org.jboss.threads@2.3.3.Final//org.jboss.threads.EnhancedQueueExecutor.safeRun( EnhancedQueueExecutor.java:1982) at org.jboss.threads@2.3.3.Final//org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1486) at org.jboss.threads@2.3.3.Final / /org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1363) at java.base/java.lang.Thread.run(Thread.java:834) Caused by: org.jboss.as.server.deployment.DeploymentUnitProcessingException: WFLYEJB0406: No EJB found with interface of type 'ejb.ResetEjb' for binding ejb.CategoryEjbTest/resetEjb at org.jboss.as.ejb3@18.0.1.Final//org.jboss.as.ejb3.deployment.processors.EjbInjectionSource.getResourceValue(EjbInjectionSource.java:90) at org.jboss.as.ee@18.0.1.Final//org.jboss.as.ee.component.deployers.ModuleJndiBindingProcessor.addJndiBinding(ModuleJndiBindingProcessor.java:269) at org.jboss.as.ee@18.0.1.Final//org.Z /org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1363) at java.base/java.lang.Thread.run(Thread.java:834) Caused by: org.jboss.as.server.deployment .DeploymentUnitProcessingException: WFLYEJB0406: No EJB found with interface of type 'ejb.ResetEjb' for binding ejb.CategoryEjbTest/resetEjb at org.jboss.as.ejb3@18.0.1.Final//org.jboss.as.ejb3.deployment. processors.EjbInjectionSource.getResourceValue(EjbInjectionSource.java:90) at org.jboss.as.ee@18.0.1.Final//org.jboss.as.ee.component.deployers.ModuleJndiBindingProcessor.addJndiBinding(ModuleJndiBindingProcessor.java:269)在 org.jboss.as.ee@18.0.1.Final//org.Z 9764DC122BE894C72F6314703587F596Z.as.ee.component.deployers.ModuleJndiBindingProcessor.deploy(ModuleJndiBindingProcessor.java:200) at org.jboss.as.server@10.0.3.Final//org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:176)... 8 more 9764DC122BE894C72F6314703587F596Z.as.ee.component.deployers.ModuleJndiBindingProcessor.deploy(ModuleJndiBindingProcessor.java:200) at org.jboss.as.server@10.0.3.Final//org.jboss.as.server.deployment.DeploymentUnitPhaseService.start( DeploymentUnitPhaseService.java:176)... 8 更多

And when i run test directly from the class it says:当我直接从 class 运行测试时,它说:

Test ignored java.lang.RuntimeException: Could not create new instance of class org.jboss.arquillian.test.impl.EventTestRunnerAdaptor at org.jboss.arquillian.test.spi.SecurityActions.newInstance(SecurityActions.java:146) at org.jboss.arquillian.test.spi.SecurityActions.newInstance(SecurityActions.java:89) at org.jboss.arquillian.test.spi.TestRunnerAdaptorBuilder.build(TestRunnerAdaptorBuilder.java:49) at org.jboss.arquillian.junit.AdaptorManager.initializeAdaptor(AdaptorManager.java:21) at org.jboss.arquillian.junit.AdaptorManagerWithNotifier.initializeAdaptor(AdaptorManagerWithNoti Test ignored java.lang.RuntimeException: Could not create new instance of class org.jboss.arquillian.test.impl.EventTestRunnerAdaptor at org.jboss.arquillian.test.spi.SecurityActions.newInstance(SecurityActions.java:146) at org. jboss.arquillian.test.spi.SecurityActions.newInstance(SecurityActions.java:89) at org.jboss.arquillian.test.spi.TestRunnerAdaptorBuilder.build(TestRunnerAdaptorBuilder.java:49) at org.jboss.arquillian.junit.AdaptorManager. org.jboss.arquillian.junit.AdaptorManagerAdaptorWithNotiAdaptor( fier.java:19) at org.jboss.arquillian.junit.Arquillian.run(Arquillian.java:109) at org.junit.runner.JUnitCore.run(JUnitCore.java:137) at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69) at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33) at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:220) at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:53) Caused by: Z93F725A074 fier.java:19) at org.jboss.arquillian.junit.Arquillian.run(Arquillian.java:109) at org.junit.runner.JUnitCore.run(JUnitCore.java:137) at com.intellij.junit4.JUnit4IdeaTestRunner .startRunnerWithArgs(JUnit4IdeaTestRunner.java:69) at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33) at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:220) at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:53A574) 引起:Z93F2 23FE1C889F448B33D21F46Z.lang.reflect.InvocationTargetException at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490) at org.jboss.arquillian.test.spi.SecurityActions.newInstance(SecurityActions.java:144)... 10 more Caused by: org.jboss.arquillian.container.impl.ContainerCreationException: Could not create Container wildfly at org.Z9764DC122BE894C7 23FE1C889F448B33D21F46Z.lang.reflect.InvocationTargetException at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at java.base /jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490) at org.jboss.arquillian.test.spi.SecurityActions .newInstance(SecurityActions.java:144)... 10 更多原因:org.jboss.arquillian.container.impl.ContainerCreationException: 无法在 org.Z9764DC1 创建容器 wildfly2BE894 2F6314703587F596Z.arquillian.container.impl.LocalContainerRegistry.create(LocalContainerRegistry.java:78) at org.jboss.arquillian.container.impl.client.container.ContainerRegistryCreator.createRegistry(ContainerRegistryCreator.java:74) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.Z93F725A07423FE1C 2F6314703587F596Z.arquillian.container.impl.LocalContainerRegistry.create(LocalContainerRegistry.java:78) at org.jboss.arquillian.container.impl.client.container.ContainerRegistryCreator.createRegistry(ContainerRegistryCreator.java:74) at java.base/jdk. internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java :43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.Z93F725A07423FE1C 889F448B33D21F46Z:86) at org.jboss.arquillian.core.impl.EventContextImpl.invokeObservers(EventContextImpl.java:103) at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:90) at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:133) at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:105) at org.jboss.arquillian.core.impl.ManagerImpl.bindAndFire(ManagerImpl.java:232) at org.jboss.arquillian.core.impl.InstanceImpl.set(InstanceImpl.java:67) at org.jboss.arquillian.config.impl.extension.ConfigurationRegistrar.loadConfiguration(ConfigurationRegistrar.Z93F725 889F448B33D21F46Z:86) at org.jboss.arquillian.core.impl.EventContextImpl.invokeObservers(EventContextImpl.java:103) at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:90) at org.jboss .arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:133) at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:105) at org.jboss.arquillian.core.impl.ManagerImpl .bindAndFire(ManagerImpl.java:232) at org.jboss.arquillian.core.impl.InstanceImpl.set(InstanceImpl.java:67) at org.jboss.arquillian.config.impl.extension.ConfigurationRegistrar.loadConfiguration(ConfigurationRegistrar.Z93F725 A07423FE1C889F448B33D21F46Z:72) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:86) at org.jboss.arquillian.core.impl.EventContextImpl.invokeObservers(EventContextImpl.java:103) at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.Z93F725A07423 A07423FE1C889F448B33D21F46Z:72) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk. internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.jboss.arquillian.core.impl.ObserverImpl.invoke( ObserverImpl.java:86) at org.jboss.arquillian.core.impl.EventContextImpl.invokeObservers(EventContextImpl.java:103) at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.Z93F725A07423 FE1C889F448B33D21F46Z:90) at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:133) at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:105) at org.jboss.arquillian.core.impl.ManagerImpl.start(ManagerImpl.java:253) at org.jboss.arquillian.test.impl.EventTestRunnerAdaptor.(EventTestRunnerAdaptor.java:61)... 15 more Caused by: java.lang.IllegalStateException: Multiple service implementations found for interface org.jboss.arquillian.container.spi.client.container.DeployableContainer: org.jboss.as.arquillian.container.managed.ManagedDeployableContainer, org.jboss.arquillian.container.glassfish.managed_3_1.GlassFi FE1C889F448B33D21F46Z:90) at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:133) at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:105) at org.jboss .arquillian.core.impl.ManagerImpl.start(ManagerImpl.java:253) at org.jboss.arquillian.test.impl.EventTestRunnerAdaptor.(EventTestRunnerAdaptor.java:61)... 15 more Caused by: java.lang.IllegalStateException : Multiple service implementations found for interface org.jboss.arquillian.container.spi.client.container.DeployableContainer: org.jboss.as.arquillian.container.managed.ManagedDeployableContainer, org.jboss.arquillian.container.glassfish.managed_3_1.GlassFi shManagedDeployableContainer at org.jboss.arquillian.core.impl.loadable.ServiceRegistryLoader.onlyOne(ServiceRegistryLoader.java:67) at org.jboss.arquillian.container.impl.LocalContainerRegistry.create(LocalContainerRegistry.java:75)... 39 more shManagedDeployableContainer at org.jboss.arquillian.core.impl.loadable.ServiceRegistryLoader.onlyOne(ServiceRegistryLoader.java:67) at org.jboss.arquillian.container.impl.LocalContainerRegistry.create(LocalContainerRegistry.java:75)... 39 more

Arquillian.xml file: Arquillian.xml 文件:

<arquillian xmlns="http://jboss.org/schema/arquillian"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="
    http://jboss.org/schema/arquillian
    http://jboss.org/schema/arquillian/arquillian_1_0.xsd">


<container qualifier="wildfly" default="true">
    <configuration>
        <!-- This is needed to tell Arquillian where the Wildfly installation is -->
        <property name="jbossHome">target/downloaded_Wildfly/wildfly</property>
        <property name="outputToConsole">true</property>

        <!-- Uncomment this if you need to do a remote debugging of a running Wildfly -->
        <!--<property name="javaVmArguments">-->
        <!-- -Xrunjdwp:transport=dt_socket,address=5005,server=y,suspend=y-->
        <!--</property>-->
    </configuration>
</container>

Persistence.xml file is located in: Persistence.xml 文件位于:

<?xml version="1.0" encoding="UTF-8"?>

 <persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence 
 http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
         version="2.1">


<persistence-unit name="JTA" transaction-type="JTA">
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
    <properties>
        <property name="wildfly.jpa.default-unit" value="true"/>
        <property name="connection.driver_class" value="org.h2.Driver"/>
        <property name="hibernate.connection.url" value="jdbc:h2:./target/db"/>
        <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
        <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
        <property name="hibernate.show_sql" value="false"/>
    </properties>
</persistence-unit>


<persistence-unit name="DB" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>

    <properties>
        <!-- for now we use an embedded database (ie H2), just for testing-->
        <property name="connection.driver_class" value="org.h2.Driver"/>
       
        <!-- specify we are connecting to a H2 database -->
        <property name="hibernate.connection.url" value="jdbc:h2:./target/db"/>
        <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
       
        <!--
        This will make sure we use a new database at each new connection (ie 
        EntityManagerFactory),
        deleting all existing data. The schema is created based on the @Entity classes
        on the classpath
        -->
        <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
        <!-- This does show on the console the SQL statements executed by Hibernate -->
        <property name="hibernate.show_sql" value="true"/>
    </properties>
</persistence-unit>

file structure:文件结构: 在此处输入图像描述

My Maven filen:我的 Maven 文件:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
   http://maven.apache.org/xsd/maven-4.0.0.xsd">

<modelVersion>4.0.0</modelVersion>
<groupId>org.quiz</groupId>
<artifactId>quiz</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>


<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <fs>${file.separator}</fs>
    <version.java>11</version.java>
    <version.junit>5.6.2</version.junit>
    <version.junit.platform>1.5.2</version.junit.platform>
    <version.jacoco>0.8.5</version.jacoco>
    <!--  FIXME version 1.4.200 breaks tests, eg in JPA-JPQL  -->
    <version.h2>1.4.197</version.h2>
    <version.testcontainers>1.12.4</version.testcontainers>

    <!--
        TODO: cannot update to 4.3+ as conflicts of major versioning
        of Groovy runtime
    -->
    <version.surefire-failsafe>3.0.0-M4</version.surefire-failsafe>
    <maven.compiler.source>1.11</maven.compiler.source>
    <maven.compiler.target>1.11</maven.compiler.target>
    <version.hibernate.validator>6.1.0.Final</version.hibernate.validator>
    <version.hibernate.core>5.3.7.Final</version.hibernate.core>
    <version.javax.el>3.0.0</version.javax.el>
    <version.javax.javae.api>8.0.1</version.javax.javae.api>
    <jbossTarget>${basedir}/target/downloaded_Wildfly</jbossTarget>
    <jbossHome>${jbossTarget}/wildfly</jbossHome>
    <version.wildfly>18.0.1.Final</version.wildfly>

</properties>


<dependencies>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>${version.hibernate.core}</version>
        <scope>provided</scope>
    </dependency>

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>${version.hibernate.validator}</version>
        <scope>provided</scope>
    </dependency>

    <dependency>
        <!-- Note: this has the other as dependency -->
        <groupId>org.glassfish</groupId>
        <artifactId>javax.el</artifactId><!--Db-->
        <version>${version.javax.el}</version>
    </dependency>

    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-api</artifactId>
        <version>${version.javax.javae.api}</version>
        <scope>provided</scope>
    </dependency>

    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <version>1.4.197</version>
        <scope>provided</scope>
    </dependency>


    <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>2.3.1</version>
    </dependency>

    <dependency>
        <groupId>org.glassfish.jaxb</groupId>
        <artifactId>jaxb-runtime</artifactId>
        <version>2.3.1</version>
    </dependency>

    <dependency>
        <groupId>org.wildfly.arquillian</groupId>
        <artifactId>wildfly-arquillian-container-managed</artifactId>
        <version>2.2.0.Final</version>
        <scope>test</scope>
    </dependency>


    <!-- tests -->
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter</artifactId>
        <version>${version.junit}</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <!-- To support JUnit 5  -->
        <groupId>org.testcontainers</groupId>
        <artifactId>junit-jupiter</artifactId>
        <version>${version.testcontainers}</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.junit.vintage</groupId>
        <artifactId>junit-vintage-engine</artifactId>
        <version>${version.junit}</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.jboss.arquillian.junit</groupId>
        <artifactId>arquillian-junit-container</artifactId>
        <version>1.5.0.Final</version>
        <!-- make sure it is in test scope -->
        <scope>test</scope>
    </dependency>
</dependencies>


<build>

    <plugins>

        <!-- Used to download and unpack JBoss/Wildfly automatically before running the 
         tests-->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
                <execution>
                    <id>unpack</id>
                    <phase>process-test-classes</phase>
                    <goals>
                        <goal>unpack</goal>
                    </goals>
                    <configuration>
                        <artifactItems>
                            <artifactItem>
                                <groupId>org.wildfly</groupId>
                                <artifactId>wildfly-dist</artifactId>
                                <version>${version.wildfly}</version>
                                <type>zip</type>
                                <overWrite>false</overWrite>
                                <outputDirectory>${jbossTarget}</outputDirectory>
                            </artifactItem>
                        </artifactItems>
                    </configuration>
                </execution>
            </executions>
        </plugin>

        <!--
        When unzipping Wildfly, the folder name will contain the version.
        This is not good, as then we would need to hardcode such version
        in each Arquillian file.
        So, we make sure to rename such folder.
        Why? If then we change Wildfly version, we only update such value
        here in the pom file, and not in every single Arquillian file.-->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-antrun-plugin</artifactId>
            <version>1.8</version>
            <executions>
                <execution>
                    <id>Rename Wildfly folder</id>
                    <phase>process-test-classes</phase>
                    <goals>
                        <goal>run</goal>
                    </goals>
                    <configuration>
                        <target>
                            <move file="${jbossTarget}/wildfly-${version.wildfly}"
                                  tofile="${jbossTarget}/wildfly"
                                  failonerror="false"
                            />
                        </target>
                    </configuration>
                </execution>
            </executions>
        </plugin>


        <!-- Built-in plugin used to compile Java code -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <inherited>true</inherited>
            <configuration>
                <release>${version.java}</release>
            </configuration>
        </plugin>


        <!--
            Used to calculate code-coverage of the tests
        -->
        <plugin>
            <groupId>org.jacoco</groupId>
            <artifactId>jacoco-maven-plugin</artifactId>
            <version>${version.jacoco}</version>
            <executions>
                <execution>
                    <id>default-prepare-agent</id>
                    <phase>initialize</phase>
                    <goals>
                        <goal>prepare-agent</goal>
                    </goals>
                </execution>
                <execution>
                    <id>default-report</id>
                    <phase>prepare-package</phase>
                    <goals>
                        <goal>report</goal>
                    </goals>
                </execution>
                <execution>
                    <id>default-prepare-agent-integration</id>
                    <phase>package</phase>
                    <goals>
                        <goal>prepare-agent-integration</goal>
                    </goals>
                </execution>
                <execution>
                    <id>default-report-integration</id>
                    <phase>verify</phase>
                    <goals>
                        <goal>report-integration</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

Test classes:测试类:

package ejb;

import entities.Category;
import entities.Quiz;
import entities.SubCategory;

import javax.ejb.Stateless;
import javax.persistence.Entity;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

/*Created by Andrea Arcuri
 * github: https://github.com/arcuri82/testing_security_development_enterprise_systems*/


@Stateless
public class ResetEjb {

public ResetEjb(){}

@PersistenceContext
EntityManager em;

public void resetDatabase(){
    deleteEntities(Quiz.class);
    deleteEntities(SubCategory.class);
    deleteEntities(Category.class);
}

private void deleteEntities(Class<?> entity){

    if(entity == null || entity.getAnnotation(Entity.class) == null){
        throw new IllegalArgumentException("Invalid non-entity class");
    }

    String name = entity.getSimpleName();

    /*
        Note: we passed as input a Class<?> instead of a String to
        avoid SQL injection. However, being here just test code, it should
        not be a problem. But, as a good habit, always be paranoiac about
        security, above all when you have code that can delete the whole
        database...
     */

    Query query = em.createQuery("delete from " + name);
    query.executeUpdate();
}

}




@RunWith(Arquillian.class)
public class CategoryEjbTest {

@Deployment
public static JavaArchive createDeployment() {

    return ShrinkWrap.create(JavaArchive.class)
            .addPackages(true, "org.quiz")
            .addAsResource("META-INF/persistence.xml");
}

@EJB
private CategoryEjb ctgEjb;

@EJB
private ResetEjb resetEjb;

@Before
public void init(){
    resetEjb.resetDatabase();
}

@Test
public void testNoCategory(){

    List<Category> list = ctgEjb.getAllCategory(false);
    assertEquals(0, list.size());
}
}

I am trying to run a EJB test using Arquillian and Junit, but getting this errror message when running command:我正在尝试使用 Arquillian 和 Junit 运行 EJB 测试,但在运行命令时收到此错误消息:

mvn test mvn 测试

that says:说的是:

No EJB found with interface of type 'ejb.ResetEjb' for binding ejb.CategoryEjbTest/resetEjb"}}找不到 EJB 类型为“ejb.ResetEjb”的接口用于绑定 ejb.CategoryEjbTest/resetEjb"}}

21:49:12,153 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-2) MSC000001: Failed to start service jboss.deployment.unit."test.war".INSTALL: org.jboss.msc.service.StartException in service jboss.deployment.unit."test.war".INSTALL: WFLYSRV0153: Failed to process phase INSTALL of deployment "test.war" at org.jboss.as.server@10.0.3.Final//org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:183) at org.jboss.msc@1.4.11.Final//org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1739) at org.jboss.msc@1.4.11.Final//org.jboss.msc.service.ServiceControllerI 21:49:12,153 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-2) MSC000001: Failed to start service jboss.deployment.unit."test.war".INSTALL: org.jboss.msc .service.StartException 在服务 jboss.deployment.unit."test.war".INSTALL: WFLYSRV0153: 在 org.jboss.as.server@0.F 处理部署“test.war”的阶段安装失败org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:183) at org.jboss.msc@1.4.11.Final//org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl. java:1739) 在 org.jboss.msc@1.4.11.Final//org.Z9764DC122BE894C72F6314703587F.serviceController.ServiceController mpl$StartTask.execute(ServiceControllerImpl.java:1701) at org.jboss.msc@1.4.11.Final//org.jboss.msc.service.ServiceControllerImpl$ControllerTask.run(ServiceControllerImpl.java:1559) at org.jboss.threads@2.3.3.Final//org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35) at org.jboss.threads@2.3.3.Final//org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1982) at org.jboss.threads@2.3.3.Final//org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1486) at org.jboss.threads@2.3.3.Final/ mpl$StartTask.execute(ServiceControllerImpl.java:1701) at org.jboss.msc@1.4.11.Final//org.jboss.msc.service.ServiceControllerImpl$ControllerTask.run(ServiceControllerImpl.java:1559) at org.jboss .threads@2.3.3.Final//org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35) at org.jboss.threads@2.3.3.Final//org.jboss.threads.EnhancedQueueExecutor.safeRun( EnhancedQueueExecutor.java:1982) at org.jboss.threads@2.3.3.Final//org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1486) at org.jboss.threads@2.3.3.Final / /org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1363) at java.base/java.lang.Thread.run(Thread.java:834) Caused by: org.jboss.as.server.deployment.DeploymentUnitProcessingException: WFLYEJB0406: No EJB found with interface of type 'ejb.ResetEjb' for binding ejb.CategoryEjbTest/resetEjb at org.jboss.as.ejb3@18.0.1.Final//org.jboss.as.ejb3.deployment.processors.EjbInjectionSource.getResourceValue(EjbInjectionSource.java:90) at org.jboss.as.ee@18.0.1.Final//org.jboss.as.ee.component.deployers.ModuleJndiBindingProcessor.addJndiBinding(ModuleJndiBindingProcessor.java:269) at org.jboss.as.ee@18.0.1.Final//org.Z /org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1363) at java.base/java.lang.Thread.run(Thread.java:834) Caused by: org.jboss.as.server.deployment .DeploymentUnitProcessingException: WFLYEJB0406: No EJB found with interface of type 'ejb.ResetEjb' for binding ejb.CategoryEjbTest/resetEjb at org.jboss.as.ejb3@18.0.1.Final//org.jboss.as.ejb3.deployment. processors.EjbInjectionSource.getResourceValue(EjbInjectionSource.java:90) at org.jboss.as.ee@18.0.1.Final//org.jboss.as.ee.component.deployers.ModuleJndiBindingProcessor.addJndiBinding(ModuleJndiBindingProcessor.java:269)在 org.jboss.as.ee@18.0.1.Final//org.Z 9764DC122BE894C72F6314703587F596Z.as.ee.component.deployers.ModuleJndiBindingProcessor.deploy(ModuleJndiBindingProcessor.java:200) at org.jboss.as.server@10.0.3.Final//org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:176)... 8 more 9764DC122BE894C72F6314703587F596Z.as.ee.component.deployers.ModuleJndiBindingProcessor.deploy(ModuleJndiBindingProcessor.java:200) at org.jboss.as.server@10.0.3.Final//org.jboss.as.server.deployment.DeploymentUnitPhaseService.start( DeploymentUnitPhaseService.java:176)... 8 更多

And when i run test directly from the class it says:当我直接从 class 运行测试时,它说:

Test ignored java.lang.RuntimeException: Could not create new instance of class org.jboss.arquillian.test.impl.EventTestRunnerAdaptor at org.jboss.arquillian.test.spi.SecurityActions.newInstance(SecurityActions.java:146) at org.jboss.arquillian.test.spi.SecurityActions.newInstance(SecurityActions.java:89) at org.jboss.arquillian.test.spi.TestRunnerAdaptorBuilder.build(TestRunnerAdaptorBuilder.java:49) at org.jboss.arquillian.junit.AdaptorManager.initializeAdaptor(AdaptorManager.java:21) at org.jboss.arquillian.junit.AdaptorManagerWithNotifier.initializeAdaptor(AdaptorManagerWithNoti Test ignored java.lang.RuntimeException: Could not create new instance of class org.jboss.arquillian.test.impl.EventTestRunnerAdaptor at org.jboss.arquillian.test.spi.SecurityActions.newInstance(SecurityActions.java:146) at org. jboss.arquillian.test.spi.SecurityActions.newInstance(SecurityActions.java:89) at org.jboss.arquillian.test.spi.TestRunnerAdaptorBuilder.build(TestRunnerAdaptorBuilder.java:49) at org.jboss.arquillian.junit.AdaptorManager. org.jboss.arquillian.junit.AdaptorManagerAdaptorWithNotiAdaptor( fier.java:19) at org.jboss.arquillian.junit.Arquillian.run(Arquillian.java:109) at org.junit.runner.JUnitCore.run(JUnitCore.java:137) at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69) at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33) at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:220) at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:53) Caused by: Z93F725A074 fier.java:19) at org.jboss.arquillian.junit.Arquillian.run(Arquillian.java:109) at org.junit.runner.JUnitCore.run(JUnitCore.java:137) at com.intellij.junit4.JUnit4IdeaTestRunner .startRunnerWithArgs(JUnit4IdeaTestRunner.java:69) at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33) at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:220) at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:53A574) 引起:Z93F2 23FE1C889F448B33D21F46Z.lang.reflect.InvocationTargetException at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490) at org.jboss.arquillian.test.spi.SecurityActions.newInstance(SecurityActions.java:144)... 10 more Caused by: org.jboss.arquillian.container.impl.ContainerCreationException: Could not create Container wildfly at org.Z9764DC122BE894C7 23FE1C889F448B33D21F46Z.lang.reflect.InvocationTargetException at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at java.base /jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490) at org.jboss.arquillian.test.spi.SecurityActions .newInstance(SecurityActions.java:144)... 10 更多原因:org.jboss.arquillian.container.impl.ContainerCreationException: 无法在 org.Z9764DC1 创建容器 wildfly2BE894 2F6314703587F596Z.arquillian.container.impl.LocalContainerRegistry.create(LocalContainerRegistry.java:78) at org.jboss.arquillian.container.impl.client.container.ContainerRegistryCreator.createRegistry(ContainerRegistryCreator.java:74) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.Z93F725A07423FE1C 2F6314703587F596Z.arquillian.container.impl.LocalContainerRegistry.create(LocalContainerRegistry.java:78) at org.jboss.arquillian.container.impl.client.container.ContainerRegistryCreator.createRegistry(ContainerRegistryCreator.java:74) at java.base/jdk. internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java :43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.Z93F725A07423FE1C 889F448B33D21F46Z:86) at org.jboss.arquillian.core.impl.EventContextImpl.invokeObservers(EventContextImpl.java:103) at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:90) at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:133) at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:105) at org.jboss.arquillian.core.impl.ManagerImpl.bindAndFire(ManagerImpl.java:232) at org.jboss.arquillian.core.impl.InstanceImpl.set(InstanceImpl.java:67) at org.jboss.arquillian.config.impl.extension.ConfigurationRegistrar.loadConfiguration(ConfigurationRegistrar.Z93F725 889F448B33D21F46Z:86) at org.jboss.arquillian.core.impl.EventContextImpl.invokeObservers(EventContextImpl.java:103) at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:90) at org.jboss .arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:133) at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:105) at org.jboss.arquillian.core.impl.ManagerImpl .bindAndFire(ManagerImpl.java:232) at org.jboss.arquillian.core.impl.InstanceImpl.set(InstanceImpl.java:67) at org.jboss.arquillian.config.impl.extension.ConfigurationRegistrar.loadConfiguration(ConfigurationRegistrar.Z93F725 A07423FE1C889F448B33D21F46Z:72) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:86) at org.jboss.arquillian.core.impl.EventContextImpl.invokeObservers(EventContextImpl.java:103) at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.Z93F725A07423 A07423FE1C889F448B33D21F46Z:72) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk. internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.jboss.arquillian.core.impl.ObserverImpl.invoke( ObserverImpl.java:86) at org.jboss.arquillian.core.impl.EventContextImpl.invokeObservers(EventContextImpl.java:103) at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.Z93F725A07423 FE1C889F448B33D21F46Z:90) at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:133) at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:105) at org.jboss.arquillian.core.impl.ManagerImpl.start(ManagerImpl.java:253) at org.jboss.arquillian.test.impl.EventTestRunnerAdaptor.(EventTestRunnerAdaptor.java:61)... 15 more Caused by: java.lang.IllegalStateException: Multiple service implementations found for interface org.jboss.arquillian.container.spi.client.container.DeployableContainer: org.jboss.as.arquillian.container.managed.ManagedDeployableContainer, org.jboss.arquillian.container.glassfish.managed_3_1.GlassFi FE1C889F448B33D21F46Z:90) at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:133) at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:105) at org.jboss .arquillian.core.impl.ManagerImpl.start(ManagerImpl.java:253) at org.jboss.arquillian.test.impl.EventTestRunnerAdaptor.(EventTestRunnerAdaptor.java:61)... 15 more Caused by: java.lang.IllegalStateException : Multiple service implementations found for interface org.jboss.arquillian.container.spi.client.container.DeployableContainer: org.jboss.as.arquillian.container.managed.ManagedDeployableContainer, org.jboss.arquillian.container.glassfish.managed_3_1.GlassFi shManagedDeployableContainer at org.jboss.arquillian.core.impl.loadable.ServiceRegistryLoader.onlyOne(ServiceRegistryLoader.java:67) at org.jboss.arquillian.container.impl.LocalContainerRegistry.create(LocalContainerRegistry.java:75)... 39 more shManagedDeployableContainer at org.jboss.arquillian.core.impl.loadable.ServiceRegistryLoader.onlyOne(ServiceRegistryLoader.java:67) at org.jboss.arquillian.container.impl.LocalContainerRegistry.create(LocalContainerRegistry.java:75)... 39 more

Arquillian.xml file: Arquillian.xml 文件:

<arquillian xmlns="http://jboss.org/schema/arquillian"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="
    http://jboss.org/schema/arquillian
    http://jboss.org/schema/arquillian/arquillian_1_0.xsd">


<container qualifier="wildfly" default="true">
    <configuration>
        <!-- This is needed to tell Arquillian where the Wildfly installation is -->
        <property name="jbossHome">target/downloaded_Wildfly/wildfly</property>
        <property name="outputToConsole">true</property>

        <!-- Uncomment this if you need to do a remote debugging of a running Wildfly -->
        <!--<property name="javaVmArguments">-->
        <!-- -Xrunjdwp:transport=dt_socket,address=5005,server=y,suspend=y-->
        <!--</property>-->
    </configuration>
</container>

Persistence.xml file is located in: Persistence.xml 文件位于:

<?xml version="1.0" encoding="UTF-8"?>

 <persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence 
 http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
         version="2.1">


<persistence-unit name="JTA" transaction-type="JTA">
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
    <properties>
        <property name="wildfly.jpa.default-unit" value="true"/>
        <property name="connection.driver_class" value="org.h2.Driver"/>
        <property name="hibernate.connection.url" value="jdbc:h2:./target/db"/>
        <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
        <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
        <property name="hibernate.show_sql" value="false"/>
    </properties>
</persistence-unit>


<persistence-unit name="DB" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>

    <properties>
        <!-- for now we use an embedded database (ie H2), just for testing-->
        <property name="connection.driver_class" value="org.h2.Driver"/>
       
        <!-- specify we are connecting to a H2 database -->
        <property name="hibernate.connection.url" value="jdbc:h2:./target/db"/>
        <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
       
        <!--
        This will make sure we use a new database at each new connection (ie 
        EntityManagerFactory),
        deleting all existing data. The schema is created based on the @Entity classes
        on the classpath
        -->
        <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
        <!-- This does show on the console the SQL statements executed by Hibernate -->
        <property name="hibernate.show_sql" value="true"/>
    </properties>
</persistence-unit>

file structure:文件结构: 在此处输入图像描述

My Maven filen:我的 Maven 文件:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
   http://maven.apache.org/xsd/maven-4.0.0.xsd">

<modelVersion>4.0.0</modelVersion>
<groupId>org.quiz</groupId>
<artifactId>quiz</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>


<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <fs>${file.separator}</fs>
    <version.java>11</version.java>
    <version.junit>5.6.2</version.junit>
    <version.junit.platform>1.5.2</version.junit.platform>
    <version.jacoco>0.8.5</version.jacoco>
    <!--  FIXME version 1.4.200 breaks tests, eg in JPA-JPQL  -->
    <version.h2>1.4.197</version.h2>
    <version.testcontainers>1.12.4</version.testcontainers>

    <!--
        TODO: cannot update to 4.3+ as conflicts of major versioning
        of Groovy runtime
    -->
    <version.surefire-failsafe>3.0.0-M4</version.surefire-failsafe>
    <maven.compiler.source>1.11</maven.compiler.source>
    <maven.compiler.target>1.11</maven.compiler.target>
    <version.hibernate.validator>6.1.0.Final</version.hibernate.validator>
    <version.hibernate.core>5.3.7.Final</version.hibernate.core>
    <version.javax.el>3.0.0</version.javax.el>
    <version.javax.javae.api>8.0.1</version.javax.javae.api>
    <jbossTarget>${basedir}/target/downloaded_Wildfly</jbossTarget>
    <jbossHome>${jbossTarget}/wildfly</jbossHome>
    <version.wildfly>18.0.1.Final</version.wildfly>

</properties>


<dependencies>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>${version.hibernate.core}</version>
        <scope>provided</scope>
    </dependency>

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>${version.hibernate.validator}</version>
        <scope>provided</scope>
    </dependency>

    <dependency>
        <!-- Note: this has the other as dependency -->
        <groupId>org.glassfish</groupId>
        <artifactId>javax.el</artifactId><!--Db-->
        <version>${version.javax.el}</version>
    </dependency>

    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-api</artifactId>
        <version>${version.javax.javae.api}</version>
        <scope>provided</scope>
    </dependency>

    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <version>1.4.197</version>
        <scope>provided</scope>
    </dependency>


    <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>2.3.1</version>
    </dependency>

    <dependency>
        <groupId>org.glassfish.jaxb</groupId>
        <artifactId>jaxb-runtime</artifactId>
        <version>2.3.1</version>
    </dependency>

    <dependency>
        <groupId>org.wildfly.arquillian</groupId>
        <artifactId>wildfly-arquillian-container-managed</artifactId>
        <version>2.2.0.Final</version>
        <scope>test</scope>
    </dependency>


    <!-- tests -->
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter</artifactId>
        <version>${version.junit}</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <!-- To support JUnit 5  -->
        <groupId>org.testcontainers</groupId>
        <artifactId>junit-jupiter</artifactId>
        <version>${version.testcontainers}</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.junit.vintage</groupId>
        <artifactId>junit-vintage-engine</artifactId>
        <version>${version.junit}</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.jboss.arquillian.junit</groupId>
        <artifactId>arquillian-junit-container</artifactId>
        <version>1.5.0.Final</version>
        <!-- make sure it is in test scope -->
        <scope>test</scope>
    </dependency>
</dependencies>


<build>

    <plugins>

        <!-- Used to download and unpack JBoss/Wildfly automatically before running the 
         tests-->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
                <execution>
                    <id>unpack</id>
                    <phase>process-test-classes</phase>
                    <goals>
                        <goal>unpack</goal>
                    </goals>
                    <configuration>
                        <artifactItems>
                            <artifactItem>
                                <groupId>org.wildfly</groupId>
                                <artifactId>wildfly-dist</artifactId>
                                <version>${version.wildfly}</version>
                                <type>zip</type>
                                <overWrite>false</overWrite>
                                <outputDirectory>${jbossTarget}</outputDirectory>
                            </artifactItem>
                        </artifactItems>
                    </configuration>
                </execution>
            </executions>
        </plugin>

        <!--
        When unzipping Wildfly, the folder name will contain the version.
        This is not good, as then we would need to hardcode such version
        in each Arquillian file.
        So, we make sure to rename such folder.
        Why? If then we change Wildfly version, we only update such value
        here in the pom file, and not in every single Arquillian file.-->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-antrun-plugin</artifactId>
            <version>1.8</version>
            <executions>
                <execution>
                    <id>Rename Wildfly folder</id>
                    <phase>process-test-classes</phase>
                    <goals>
                        <goal>run</goal>
                    </goals>
                    <configuration>
                        <target>
                            <move file="${jbossTarget}/wildfly-${version.wildfly}"
                                  tofile="${jbossTarget}/wildfly"
                                  failonerror="false"
                            />
                        </target>
                    </configuration>
                </execution>
            </executions>
        </plugin>


        <!-- Built-in plugin used to compile Java code -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <inherited>true</inherited>
            <configuration>
                <release>${version.java}</release>
            </configuration>
        </plugin>


        <!--
            Used to calculate code-coverage of the tests
        -->
        <plugin>
            <groupId>org.jacoco</groupId>
            <artifactId>jacoco-maven-plugin</artifactId>
            <version>${version.jacoco}</version>
            <executions>
                <execution>
                    <id>default-prepare-agent</id>
                    <phase>initialize</phase>
                    <goals>
                        <goal>prepare-agent</goal>
                    </goals>
                </execution>
                <execution>
                    <id>default-report</id>
                    <phase>prepare-package</phase>
                    <goals>
                        <goal>report</goal>
                    </goals>
                </execution>
                <execution>
                    <id>default-prepare-agent-integration</id>
                    <phase>package</phase>
                    <goals>
                        <goal>prepare-agent-integration</goal>
                    </goals>
                </execution>
                <execution>
                    <id>default-report-integration</id>
                    <phase>verify</phase>
                    <goals>
                        <goal>report-integration</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

Test classes:测试类:

package ejb;

import entities.Category;
import entities.Quiz;
import entities.SubCategory;

import javax.ejb.Stateless;
import javax.persistence.Entity;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

/*Created by Andrea Arcuri
 * github: https://github.com/arcuri82/testing_security_development_enterprise_systems*/


@Stateless
public class ResetEjb {

public ResetEjb(){}

@PersistenceContext
EntityManager em;

public void resetDatabase(){
    deleteEntities(Quiz.class);
    deleteEntities(SubCategory.class);
    deleteEntities(Category.class);
}

private void deleteEntities(Class<?> entity){

    if(entity == null || entity.getAnnotation(Entity.class) == null){
        throw new IllegalArgumentException("Invalid non-entity class");
    }

    String name = entity.getSimpleName();

    /*
        Note: we passed as input a Class<?> instead of a String to
        avoid SQL injection. However, being here just test code, it should
        not be a problem. But, as a good habit, always be paranoiac about
        security, above all when you have code that can delete the whole
        database...
     */

    Query query = em.createQuery("delete from " + name);
    query.executeUpdate();
}

}




@RunWith(Arquillian.class)
public class CategoryEjbTest {

@Deployment
public static JavaArchive createDeployment() {

    return ShrinkWrap.create(JavaArchive.class)
            .addPackages(true, "org.quiz")
            .addAsResource("META-INF/persistence.xml");
}

@EJB
private CategoryEjb ctgEjb;

@EJB
private ResetEjb resetEjb;

@Before
public void init(){
    resetEjb.resetDatabase();
}

@Test
public void testNoCategory(){

    List<Category> list = ctgEjb.getAllCategory(false);
    assertEquals(0, list.size());
}
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM