例外を受け取らないと文句を言うのは奇妙に思えますが、次のようになります。
テスト中のクラス:
/**
* Implementation of {@link IGlossaryDataAccessObject} using JPA.
*/
@ApplicationScoped
public class JpaGlossaryDataAccessObject implements IGlossaryDataAccessObject {
@PersistenceContext
private EntityManager entityManager;
/*
* (non-Javadoc)
*
* @see
* ch.diction.webportal.glossary.model.IGlossaryDataAccessObject#createGlossary
* (java.lang.String)
*/
@Override
@TransactionAttribute
public void createGlossary(String glossaryName) {
final GlossaryColumn column = new GlossaryColumn(DEFAULT_GLOSSARY_COLUMN_NAME);
final GlossaryEntry entry = new GlossaryEntry(DEFAULT_ENTRY_VALUE, column);
final GlossaryRow row = new GlossaryRow(entry);
final Glossary glossary = new Glossary(glossaryName, row);
entityManager.persist(glossary);
}
// ...
}
単体テスト:
@RunWith(Arquillian.class)
public class JpaGlossaryDataAccessObjectTest {
@Deployment
public static Archive<?> createDeployment() {
final MavenDependencyResolver resolver = DependencyResolvers.use(MavenDependencyResolver.class)
.loadMetadataFromPom("pom.xml");
return ShrinkWrap
.create(WebArchive.class, "test.war")
.addPackage(Glossary.class.getPackage())
.addPackage(IdentityObject.class.getPackage())
.addPackage(IGlossaryDataAccessObject.class.getPackage())
.addPackage(EntityManagerProducer.class.getPackage())
.addAsLibraries(resolver.artifact("org.jboss.seam.persistence:seam-persistence").resolveAsFiles())
.addAsWebInfResource("ch/diction/webportal/resources/glossary/model/beans.txt", "beans.xml")
.addAsResource("ch/diction/webportal/resources/persistence/persistence.txt", "META-INF/persistence.xml");
}
@Inject
private IGlossaryDataAccessObject dao;
@PersistenceContext
private EntityManager em;
@Test
public void testCreateGlossary() {
final String glossaryName = "empty";
dao.createGlossary(glossaryName);
final List<Glossary> result = em.createQuery("SELECT g FROM Glossary g", Glossary.class).getResultList();
Assert.assertEquals(1, result.size());
}
}
ローカルの GlassFish 3.1.2.2 サーバーで Arquillian を使用して実行しているこの単体テストは、エラーや例外なしで完了します。それでも、デバッガーを使用して「dao.createGlossary(...)」の後で実行を停止すると、MySQL Workbench を使用して、実際にテーブルにデータが書き込まれていないことを確認できます。
Arquillian フレームワークは、私が認識している以上のことを行っているのではないかと考えていました。それは、ある種のデータベース テスト コンテナーを提供し、各テストの後にトランザクションを自動的にロールバックしている可能性があることです。それは事実ですか、それともデータが実際に MySQL に書き込まれないようにする可能性があるのは何ですか?
ヒントをありがとう、パスカルによろしく
PS: 完成させるために、ここに私の他のテスト構成ファイルを示します。
persistence.xml:
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0">
<persistence-unit name="web-portal-test" transaction-type="JTA">
<jta-data-source>jdbc/web-portal-test</jta-data-source>
<properties>
<property name="eclipselink.logging.level" value="INFO" />
</properties>
</persistence-unit>
</persistence>
ビーンズ.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:s="urn:java:ee"
xmlns:security="urn:java:org.jboss.seam.security" xmlns:permission="urn:java:org.jboss.seam.security.permission"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://jboss.org/schema/cdi/beans_1_0.xsd">
<alternatives />
<decorators />
<interceptors>
<class>org.jboss.seam.transaction.TransactionInterceptor</class>
</interceptors>
</beans>
arquillian.xml:
<?xml version="1.0"?>
<arquillian xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://jboss.org/schema/arquillian"
xsi:schemaLocation="http://jboss.org/schema/arquillian
http://jboss.org/schema/arquillian/arquillian_1_0.xsd">
<defaultProtocol type="Servlet 3.0" />
<container qualifier="remote-glassfish" default="true">
<configuration>
<property name="adminUser">admin</property>
<property name="adminPassword">******</property>
<property name="adminPort">4848</property>
<property name="adminHttps">false</property>
<property name="remoteServerHttpPort">9005</property>
<property name="target">server</property>
</configuration>
</container>
</arquillian>
更新: エンティティがライブ環境のデータベースに実際に格納されていることを確認できました。したがって、Arquillian は私のトランザクションを単体テスト環境でロールバックしているようです。これは奇妙です。彼らの Web サイトのガイドでは、データベースをクリーンアップするために手動の SQL コマンドを使用しているためです: http://arquillian.org/guides/testing_java_persistence/