问题在于这
Persistence.createEntityManagerFactory("abc")是“自己动手”API,并且没有利用嵌入式EJB容器。您可以
EntityManager非常轻松地在测试用例中管理一个容器。
与相关的jndi /
datasource问题一样,我建议您在examples.zip中查看示例。他们都是为了摆脱起步之苦而设计的。
这是该
testcase-injection示例的片段,该示例显示了如何从容器中获取EntityManager和其他内容以用于测试。
首先,向测试中添加一个空的ejb-jar.xml或application-client.xml,以打开扫描测试代码的步骤:
- src / test / resources / meta-INF / application-client.xml
然后,使用注释您的测试用例,
@org.apache.openejb.api.LocalClient并将标准JavaEE注释用于实际注入。
@LocalClientpublic class MoviesTest extends TestCase { @EJB private Movies movies; @Resource private UserTransaction userTransaction; @PersistenceContext private EntityManager entityManager; public void setUp() throws Exception { Properties p = new Properties(); p.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.client.LocalInitialContextFactory"); p.put("movieDatabase", "new://Resource?type=DataSource"); p.put("movieDatabase.JdbcDriver", "org.hsqldb.jdbcDriver"); p.put("movieDatabase.JdbcUrl", "jdbc:hsqldb:mem:moviedb"); InitialContext initialContext = new InitialContext(p); // Here's the fun part initialContext.bind("inject", this); }作为
movieDatabase我们设置的唯一数据源,OpenEJB会自动将该数据源分配给您的持久性单元,而无需修改您的persistence.xml。您甚至可以将
<jta-data-source>或留为
<non-jta-data-source>空白,OpenEJB仍然会知道该怎么做。
但是为了完整起见,以下是此特定应用程序如何定义
persistence.xml
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0"> <persistence-unit name="movie-unit"> <jta-data-source>movieDatabase</jta-data-source> <non-jta-data-source>movieDatabaseUnmanaged</non-jta-data-source> <class>org.superbiz.testinjection.Movie</class> <properties> <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)"/> </properties> </persistence-unit></persistence>
然后是有趣的部分,在测试中一起使用
public void test() throws Exception { userTransaction.begin(); try { entityManager.persist(new Movie("Quentin Tarantino", "Reservoir Dogs", 1992)); entityManager.persist(new Movie("Joel Coen", "Fargo", 1996)); entityManager.persist(new Movie("Joel Coen", "The Big Lebowski", 1998)); List<Movie> list = movies.getMovies(); assertEquals("List.size()", 3, list.size()); for (Movie movie : list) { movies.deleteMovie(movie); } assertEquals("Movies.getMovies()", 0, movies.getMovies().size()); } finally { userTransaction.commit(); }}


