Vấn đề là Persistence.createEntityManagerFactory("abc")
là API "tự mình làm" và không tận dụng được Vùng chứa EJB được nhúng. Bạn có thể nhận được một container được quản lý EntityManager
trong trường hợp kiểm tra của bạn rất dễ dàng.
Giống như câu hỏi jndi/datasource liên quan Tôi khuyên bạn nên xem các ví dụ trong số examples.zip. Tất cả chúng đều được thiết kế để bắt đầu cuộc đấu tranh.
Dưới đây là một đoạn trích từ ví dụ testcase-injection
cho biết cách bạn có thể lấy EntityManager và các thứ khác từ vùng chứa để sử dụng trong thử nghiệm.
Đầu tiên, thêm một sản phẩm nào ejb-jar.xml hoặc ứng dụng client.xml để thử nghiệm của bạn để bật quét mã kiểm tra của bạn:
- src/kiểm tra/nguồn/META-INF/dành cho ứng dụng client.xml
Sau đó, chú thích trường hợp thử nghiệm của bạn với @org.apache.openejb.api.LocalClient
và sử dụng chú thích JavaEE tiêu chuẩn cho việc tiêm thực tế.
@LocalClient
public 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);
}
Như movieDatabase
là DataSource duy nhất mà chúng tôi đã thiết lập, OpenEJB sẽ tự động gán DataSource để đơn vị kiên trì của bạn mà không cần phải sửa đổi persistence.xml của bạn. Bạn thậm chí có thể để trống <jta-data-source>
hoặc <non-jta-data-source>
trống và OpenEJB sẽ vẫn biết phải làm gì.
Nhưng vì lợi ích của sự hoàn chỉnh, dưới đây là cách ứng dụng cụ thể này đã xác định các 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>
Sau đó, phần thú vị, sử dụng nó tất cả cùng nhau trong các thử nghiệm
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();
}
}