Lời khuyên của tôi cho bạn sẽ không rơi vào cái bẫy chung mà tôi thấy, đó là suy nghĩ bạn cần phải chọn giữa chế nhạo và sử dụng một thùng chứa EJB được nhúng.
Bạn có thể sử dụng cả hai, bạn nên sử dụng cả hai và nơi bạn thấy khó sử dụng cả hai bạn nên yêu cầu hỗ trợ tốt hơn và nhiều tính năng hơn từ vùng chứa EJB của bạn.
Chắc chắn, bạn sẽ thấy mọi người ở OpenEJB thực sự hỗ trợ và hạnh phúc hơn khi thêm các tính năng để hỗ trợ tận dụng tối đa cả hai thế giới. Gần như tất cả các tính năng thực sự tốt đã được tạo ra xung quanh các yêu cầu của người dùng đang cố gắng làm những điều rất cụ thể và thấy khó khăn.
Chuẩn EJBContainer API
package org.superbiz.stateless.basic;
import junit.framework.TestCase;
import javax.ejb.embeddable.EJBContainer;
public class CalculatorTest extends TestCase {
private CalculatorBean calculator;
/**
* Bootstrap the Embedded EJB Container
*
* @throws Exception
*/
protected void setUp() throws Exception {
EJBContainer ejbContainer = EJBContainer.createEJBContainer();
Object object = ejbContainer.getContext().lookup("java:global/simple-stateless/CalculatorBean");
assertTrue(object instanceof CalculatorBean);
calculator = (CalculatorBean) object;
}
Full nguồn here
này quét classpath và tải tất cả các loại đậu.
Không quét, cách tiếp cận chế nhạo dễ dàng hơn
Cách tiếp cận hơi khác nơi bạn xác định mọi thứ trong mã. Rõ ràng là chế nhạo dễ dàng hơn khi bạn có thể cung cấp việc thực hiện mô hình của đậu khi cần thiết theo ý muốn.
@RunWith(ApplicationComposer.class)
public class MoviesTest extends TestCase {
@EJB
private Movies movies;
@Resource
private UserTransaction userTransaction;
@PersistenceContext
private EntityManager entityManager;
@Module
public PersistenceUnit persistence() {
PersistenceUnit unit = new PersistenceUnit("movie-unit");
unit.setJtaDataSource("movieDatabase");
unit.setNonJtaDataSource("movieDatabaseUnmanaged");
unit.getClazz().add(Movie.class.getName());
unit.setProperty("openjpa.jdbc.SynchronizeMappings", "buildSchema(ForeignKeys=true)");
return unit;
}
@Module
public EjbJar beans() {
EjbJar ejbJar = new EjbJar("movie-beans");
ejbJar.addEnterpriseBean(new StatefulBean(MoviesImpl.class));
return ejbJar;
}
@Configuration
public Properties config() throws Exception {
Properties p = new Properties();
p.put("movieDatabase", "new://Resource?type=DataSource");
p.put("movieDatabase.JdbcDriver", "org.hsqldb.jdbcDriver");
p.put("movieDatabase.JdbcUrl", "jdbc:hsqldb:mem:moviedb");
return p;
}
@Test
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();
}
}
}
Full source here
Kết quả cuối cùng
Đó là hấp dẫn để tập trung vào sự khác biệt giữa các loại khác nhau của thử nghiệm, vv nhưng chắc chắn có điều gì đó để nói cho một trung thực dụng. Cá nhân tôi không thấy bất kỳ điều gì sai trái khi có thể kết hợp các kiểu "đơn vị" và "tích hợp" thành thạo nhất có thể.
Chắc chắn, đó là một mục tiêu đáng ngưỡng mộ. Ý tưởng và yêu cầu tính năng để chúng tôi gần gũi hơn là rất đáng hoan nghênh.
Xin chào David, Cảm ơn bạn đã trả lời. Tôi cũng đã suy nghĩ về việc trộn lẫn cả hai cách tiếp cận sẽ giúp thu hoạch lợi ích của cả hai sự chấp thuận. – Bala