您不必自己做,至少如果您在項目中使用JPA 2.1。考慮下面的測試類:
@RunWith(Arquillian.class)
public class MyTest {
@Deployment
public static WebArchive createDeployment() throws Exception {
return ShrinkWrap.create(WebArchive.class)
.addAsResource("META-INF/init-schema.sql") // create table ...
.addAsResource("META-INF/testdata.sql") // insert into ...
.addAsResource("META-INF/drop-schema.sql") // drop table ...
.addAsResource("META-INF/persistence.xml");
// and maybe more ...
}
}
的createDeployment()
方法被調用來創建WAR文件,這是可以部署到你的應用服務器。
你persistence.xml
應該引用這些SQL腳本:
[...]
<persistence-unit [...]>
<properties>
<property name="javax.persistence.schema-generation.database.action" value="drop-and-create" />
<property name="javax.persistence.schema-generation.create-source" value="script" />
<property name="javax.persistence.schema-generation.create-script-source" value="META-INF/init-schema.sql" />
<property name="javax.persistence.schema-generation.drop-source" value="script" />
<property name="javax.persistence.schema-generation.drop-script-source" value="META-INF/drop-schema.sql" />
<property name="javax.persistence.sql-load-script-source" value="META-INF/testdata.sql" />
</properties>
</persistence-unit>
通過這種方式,數據庫會自動設置測試-WAR被部署時。確保SQL文件位於「META-INF」文件夾中(如果您使用Maven,它位於「src/test/resources/META-INF」中)。
如果要控制在其中正在執行的測試方法的順序,你可以使用@InSequence
註釋,例如:
public class MyTest {
[...]
private @Inject EntityManager entityManager
@Test @InSequence(0)
public void shouldHaveFoo() {
Foo foo = entityManager.find(Foo.class, Long.valueOf(1));
assertNotNull(foo);
}
@Test @InSequence(1)
public void shouldHaveBar() {
Bar bar = entityManager.find(Bar.class, Long.valueOf(99));
assertNotNull(bar);
}
}
這是個好消息!我會盡快嘗試(可能是星期一),讓你知道!謝謝! – JSBach
我想在測試中使用的腳本是用於在數據庫中部署的腳本,它使用$$作爲分隔符。我收到錯誤消息:無法執行JPA架構生成創建命令[DELIMITER $$] – JSBach
這可能是因爲換行符。看看我的[SqlAsset類](https://gist.github.com/jabu10245/80351433704e79d4fa2e)。它將多個文件合併到一個SQL文件中,並處理$$分隔符。使用addAsResource(sqlAsset,「testdata.sql」)將這個資產添加到WAR中 –