2013-09-21 56 views
7

Tôi đã hoàn thành theo hướng dẫn JPA tại http://arquillian.org/guides/testing_java_persistence/, nhưng khi tôi thử chạy thử nghiệm ("Chạy thử nghiệm trên GlassFish" phần của hướng dẫn) như JUnit tôi có được các thông điệp sau đây trong giao diện điều khiển của Eclipse:Hướng dẫn JPA Arquillian: Không thể tạo phiên bản mới của lớp org.jboss.arquillian.test.impl.EventTestRunnerAdaptor

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:160) 
    at org.jboss.arquillian.test.spi.SecurityActions.newInstance(SecurityActions.java:111) 
    at org.jboss.arquillian.test.spi.SecurityActions.newInstance(SecurityActions.java:97) 
    at org.jboss.arquillian.test.spi.TestRunnerAdaptorBuilder.build(TestRunnerAdaptorBuilder.java:52) 
    at org.jboss.arquillian.junit.Arquillian.run(Arquillian.java:93) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 
Caused by: java.lang.reflect.InvocationTargetException 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526) 
    at org.jboss.arquillian.test.spi.SecurityActions.newInstance(SecurityActions.java:156) 
    ... 10 more 
Caused by: org.jboss.arquillian.container.impl.ContainerCreationException: Could not create Container glassfish-embedded 
    at org.jboss.arquillian.container.impl.LocalContainerRegistry.create(LocalContainerRegistry.java:85) 
    at org.jboss.arquillian.container.impl.client.container.ContainerRegistryCreator.createRegistry(ContainerRegistryCreator.java:76) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:94) 
    at org.jboss.arquillian.core.impl.EventContextImpl.invokeObservers(EventContextImpl.java:99) 
    at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:81) 
    at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:135) 
    at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:115) 
    at org.jboss.arquillian.core.impl.ManagerImpl.bindAndFire(ManagerImpl.java:236) 
    at org.jboss.arquillian.core.impl.InstanceImpl.set(InstanceImpl.java:74) 
    at org.jboss.arquillian.config.impl.extension.ConfigurationRegistrar.loadConfiguration(ConfigurationRegistrar.java:60) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:94) 
    at org.jboss.arquillian.core.impl.EventContextImpl.invokeObservers(EventContextImpl.java:99) 
    at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:81) 
    at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:135) 
    at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:115) 
    at org.jboss.arquillian.core.impl.ManagerImpl.start(ManagerImpl.java:261) 
    at org.jboss.arquillian.test.impl.EventTestRunnerAdaptor.<init>(EventTestRunnerAdaptor.java:56) 
    ... 15 more 
Caused by: java.lang.IllegalArgumentException: DeployableContainer must be specified 
    at org.jboss.arquillian.core.spi.Validate.notNull(Validate.java:44) 
    at org.jboss.arquillian.container.impl.ContainerImpl.<init>(ContainerImpl.java:71) 
    at org.jboss.arquillian.container.impl.LocalContainerRegistry.create(LocalContainerRegistry.java:76) 
    ... 39 more 

pom.xml

<?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.arquillian.example</groupId> 
    <artifactId>arquillian-tutorial</artifactId> 
    <version>1.0-SNAPSHOT</version> 
    <packaging>jar</packaging> 

    <name>arquillian-tutorial</name> 
    <url>http://maven.apache.org</url> 

    <properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    </properties> 

    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-compiler-plugin</artifactId> 
     <version>2.3.2</version> 
     <configuration> 
      <source>1.6</source> 
      <target>1.6</target> 
     </configuration> 
     </plugin> 
     <plugin> 
     <artifactId>maven-compiler-plugin</artifactId> 
     <version>2.3.2</version> 
     <configuration> 
      <source>1.6</source> 
      <target>1.6</target> 
     </configuration> 
     </plugin> 
    </plugins> 
    </build> 

    <dependencyManagement> 
    <dependencies> 
     <dependency> 
      <groupId>org.jboss.arquillian</groupId> 
      <artifactId>arquillian-bom</artifactId> 
      <version>1.1.1.Final</version> 
      <scope>import</scope> 
      <type>pom</type> 
     </dependency> 
    </dependencies> 
</dependencyManagement> 

    <dependencies> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>4.8.1</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.mockito</groupId> 
     <artifactId>mockito-all</artifactId> 
     <version>1.8.5</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.hamcrest</groupId> 
     <artifactId>hamcrest-integration</artifactId> 
     <version>1.2.1</version> 
    </dependency> 
    <dependency> 
     <groupId>net.avh4.util</groupId> 
     <artifactId>imagecomparison</artifactId> 
     <version>0.0.2</version> 
     <scope>test</scope> 
    </dependency> 
     <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.junit</groupId> 
     <artifactId>arquillian-junit-container</artifactId> 
     <scope>test</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> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-jpamodelgen</artifactId> 
     <version>1.2.0.Final</version> 
     <scope>provided</scope> 
    </dependency> 
    </dependencies> 
    <profile> 
     <id>arquillian-glassfish-embedded</id> 
     <activation> 
     <activeByDefault>true</activeByDefault> 
     </activation> 
     <dependencies> 
     <dependency> 
      <groupId>org.jboss.arquillian.container</groupId> 
      <artifactId>arquillian-glassfish-embedded-3.1</artifactId> 
      <version>1.0.0.CR3</version> 
     </dependency> 
     <dependency> 
      <groupId>org.glassfish.main.extras</groupId> 
      <artifactId>glassfish-embedded-web</artifactId> 
      <version>3.1.2</version> 
     </dependency> 
     </dependencies> 
     <build> 
     <testResources> 
      <testResource> 
      <directory>src/test/resources</directory> 
      </testResource> 
      <testResource> 
      <directory>src/test/resources-glassfish-embedded</directory> 
      </testResource> 
     </testResources> 
     <plugins> 
      <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-surefire-plugin</artifactId> 
      <version>2.12</version> 
      <configuration> 
       <systemPropertyVariables> 
       <java.util.logging.config.file> 
        ${project.build.testOutputDirectory}/logging.properties 
       </java.util.logging.config.file> 
       <derby.stream.error.file> 
        ${project.build.directory}/derby.log 
       </derby.stream.error.file> 
       </systemPropertyVariables> 
      </configuration> 
      </plugin> 
     </plugins> 
     </build> 
    </profile> 
</project> 

arquillian.xml

<?xml version="1.0" encoding="UTF-8"?> 
<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="glassfish-embedded" default="true"> 
     <configuration> 
      <property name="resourcesXml"> 
       src/test/resources-glassfish-embedded/glassfish-resources.xml 
      </property> 
     </configuration> 
    </container> 
</arquillian> 

Game.java

package org.arquillian.example; 

import java.io.Serializable; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.Id; 
import javax.validation.constraints.NotNull; 
import javax.validation.constraints.Size; 

@Entity 
public class Game implements Serializable { 
    private Long id; 
    private String title; 

    public Game() {} 

    public Game(String title) { 
     this.title = title; 
    } 

    @Id @GeneratedValue 
    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    @NotNull 
    @Size(min = 3, max = 50) 
    public String getTitle() { 
     return title; 
    } 

    public void setTitle(String title) { 
     this.title = title; 
    } 

    @Override 
    public String toString() { 
     return "[email protected]" + hashCode() + "[id = " + id + "; title = " + title + "]"; 
    } 
} 

GamePersistenceTest.java

package org.arquillian.example; 


import java.util.List; 
import javax.inject.Inject; 
import javax.persistence.EntityManager; 
import javax.persistence.PersistenceContext; 
import javax.transaction.UserTransaction; 
import org.jboss.arquillian.container.test.api.Deployment; 
import org.jboss.arquillian.junit.Arquillian; 
import org.jboss.shrinkwrap.api.Archive; 
import org.jboss.shrinkwrap.api.ShrinkWrap; 
import org.jboss.shrinkwrap.api.asset.EmptyAsset; 
import org.jboss.shrinkwrap.api.spec.WebArchive; 
import org.junit.runner.RunWith; 
import org.junit.Before; 
import org.junit.After; 
import java.util.List; 
import org.junit.Test; 
import java.util.Arrays; 
import java.util.Collection; 
import java.util.HashSet; 
import java.util.Set; 
import org.junit.Assert; 
import javax.persistence.criteria.CriteriaBuilder; 
import javax.persistence.criteria.CriteriaQuery; 
import javax.persistence.criteria.Root; 


@RunWith(Arquillian.class) 
public class GamePersistenceTest { 
    @Deployment 
    public static Archive<?> createDeployment() { 
     return ShrinkWrap.create(WebArchive.class, "test.war") 
      .addPackage(Game.class.getPackage()) 
      .addAsResource("test-persistence.xml", "META-INF/persistence.xml") 
      .addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml"); 
    } 

    private static final String[] GAME_TITLES = { 
     "Super Mario Brothers", 
     "Mario Kart", 
     "F-Zero" 
    }; 

    @PersistenceContext 
    EntityManager em; 

    @Inject 
    UserTransaction utx; 

    // tests go here 

    @Before 
    public void preparePersistenceTest() throws Exception { 
     clearData(); 
     insertData(); 
     startTransaction(); 
    } 

    private void clearData() throws Exception { 
     utx.begin(); 
     em.joinTransaction(); 
     System.out.println("Dumping old records..."); 
     em.createQuery("delete from Game").executeUpdate(); 
     utx.commit(); 
    } 

    private void insertData() throws Exception { 
     utx.begin(); 
     em.joinTransaction(); 
     System.out.println("Inserting records..."); 
     for (String title : GAME_TITLES) { 
      Game game = new Game(title); 
      em.persist(game); 
     } 
     utx.commit(); 
     // clear the persistence context (first-level cache) 
     em.clear(); 
    } 

    private void startTransaction() throws Exception { 
     utx.begin(); 
     em.joinTransaction(); 
    } 
    @After 
    public void commitTransaction() throws Exception { 
     utx.commit(); 
    } 

    private static void assertContainsAllGames(Collection<Game> retrievedGames) { 
     Assert.assertEquals(GAME_TITLES.length, retrievedGames.size()); 
     final Set<String> retrievedGameTitles = new HashSet<String>(); 
     for (Game game : retrievedGames) { 
      System.out.println("* " + game); 
      retrievedGameTitles.add(game.getTitle()); 
     } 
     Assert.assertTrue(retrievedGameTitles.containsAll(Arrays.asList(GAME_TITLES))); 
    } 

    @Test 
    public void shouldFindAllGamesUsingCriteriaApi() throws Exception { 
     // given 
     CriteriaBuilder builder = em.getCriteriaBuilder(); 
     CriteriaQuery<Game> criteria = builder.createQuery(Game.class); 

     Root<Game> game = criteria.from(Game.class); 
     criteria.select(game); 
     // TIP: If you don't want to use the JPA 2 Metamodel, 
     // you can change the get() method call to get("id") 
     criteria.orderBy(builder.asc(game.get(Game_.id))); 
     // No WHERE clause, which implies select all 

     // when 
     System.out.println("Selecting (using Criteria)..."); 
     List<Game> games = em.createQuery(criteria).getResultList(); 

     // then 
     System.out.println("Found " + games.size() + " games (using Criteria):"); 
     assertContainsAllGames(games); 
    } 


} 
+0

bạn đã giải quyết vấn đề này? – Yauhen

+0

không và hiện tại tôi đang cố gắng thiết lập JPA-JTA trên môi trường Java EE –

+0

cảm ơn bạn đã trả lời. Tôi đã lãng phí rất nhiều thời gian cấu hình gradle + arquillian + thủy tinh nhúng, nhưng, thật không may, đã không tìm thấy một giải pháp phù hợp để chạy thử nghiệm của tôi. – Yauhen

Trả lời

4

Các pom.xml của dự án có một số các cấu hình như arquillian-hàn-ee- nhúng, arquillian-glassfish-embedded, và arquillian-jbossas-managed.and không có trong số chúng được kích hoạt theo mặc định, do đó, để làm cho vùng chứa container Arquillian Bạn cần phải thực hiện bất kỳ cấu hình mặc định nào trong các cấu hình này. kiểm tra pom.xml sau

  ` <dependenies> 
       <dependency> 
     <groupId>org.jboss.arquillian.junit</groupId> 
     <artifactId>arquillian-junit-container</artifactId> 
     <scope>test</scope> 
    </dependency> 
    </dependencies> 
<profiles> 
    <profile> 
     <id>arquillian-jbossas-embedded</id> 
     <activation> 
      <activeByDefault>true</activeByDefault> 
     </activation> 
     <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.CR7</version> 
      </dependency> 
      <dependency> 
       <groupId>org.jboss.weld</groupId> 
       <artifactId>weld-core</artifactId> 
       <version>2.1.0.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> 
    <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> 
      <dependency> 
       <groupId>org.jboss.arquillian.protocol</groupId> 
       <artifactId>arquillian-protocol-servlet</artifactId> 
       <scope>test</scope> 
      </dependency> 
     </dependencies> 
    </profile> 
</profiles> 

+0

nơi được nhúng arquillian-jbossas? –

+0

ìf bạn không sử dụng jboss, sau đó bạn có thể đánh dấu bất kỳ cấu hình mặc định nào khác và điều đó sẽ hoạt động –