2011-10-14 37 views
7

Tôi đang thực hiện một nghiên cứu nhỏ về Thử nghiệm đơn vị EJB 3.1. Cuối cùng, mục tiêu của tôi là tạo ra một giải pháp dễ sử dụng cho Bài kiểm tra đơn vị EJB 3.1.Kiểm tra đơn vị EJB 3.1

  1. Tôi không có nhiều kiến ​​thức với việc triển khai EJB lớn và do đó tôi muốn có được một số bàn tay có kinh nghiệm (Bạn) để đưa ra ý tưởng về các thử nghiệm EJB đơn giản.
  2. Với nghiên cứu ban đầu mà tôi đã thực hiện, tôi có thể hiểu được lợi thế của việc sử dụng khung mocking cho Kiểm thử Đơn vị thay vì sử dụng các vùng chứa được nhúng. Mặc dù cả hai đều tốt, nhưng các khuôn khổ giả mạo đứng ở trên một chút khi nói đến Kiểm thử đơn vị. Các container nhúng là ofcourse rất tốt và có lợi thế riêng của họ, nhưng có thể là một giai đoạn khác nhau của thử nghiệm đơn vị. Tôi vẫn tin rằng sẽ có một số thiếu sót ít nhất trong một số kịch bản trong việc sử dụng các khung như vậy mà có thể được cải thiện.

Tôi hy vọng tôi có thể thực hiện giải pháp hoàn chỉnh cho Bài kiểm tra đơn vị EJB mà tôi có thể chia sẻ trong diễn đàn này khi hoàn thành.

Cảm ơn sự hỗ trợ của bạn.

Trả lời

14

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.

+0

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

5

Thực tế, có hai loại khác nhau của thử nghiệm bạn có thể muốn xem xét (không độc quyền):

  • Đơn vị kiểm tra: EJB của bạn là POJO vào cuối ngày và do đó bạn có thể sử dụng ưa thích của bạn đơn vị kiểm tra khuôn khổ (ví dụ như JUnit) và cũng là một khuôn khổ mocking như Mockito hoặc EasyMock.
  • Kiểm tra tích hợp: ở đây bạn muốn kiểm tra EJB như thể chúng nằm trong thùng chứa (không phải trong sự cô lập) và do đó bạn phải bằng cách nào đó mô phỏng vùng chứa đó. Bạn vẫn có thể sử dụng khung kiểm tra đơn vị để mã hóa các thử nghiệm của mình (ví dụ: JUnit), nhưng bây giờ bạn đang thử nghiệm các EJB này hoạt động như thế nào trong vùng chứa và tương tác với các cộng tác viên khác (ví dụ: các EJB khác) mà chúng có thể có. Đối với điều này, tôi muốn giới thiệu Arquillian
+0

Cảm ơn bạn đã nhập. Tôi về cơ bản tập trung vào làm cho đơn vị thử nghiệm đơn giản hơn với các tính năng để làm cho nó như là thanh lịch và dễ dàng cho các nhà phát triển. Nhưng, như bạn cũng đã đề cập, một cách tiếp cận tốt hơn sẽ là một sự kết hợp của cả UT và tích hợp kiểm tra bằng cách sử dụng nhúng container như 2 giai đoạn của UT có vẻ là một cách tiếp cận tốt đẹp. – Bala

3

Bạn có thể sử dụng Kim để kiểm tra đơn vị các thành phần Java EE.

Kim là một khung công tác nhẹ để kiểm tra các thành phần Java EE bên ngoài vùng chứa trong sự cô lập. Nó làm giảm mã thiết lập thử nghiệm bằng cách phân tích phụ thuộc và tự động tiêm đối tượng giả.

http://needle.spree.de