2009-02-16 23 views
13

Tôi muốn có một hệ thống JUnit (hoặc khác) trong đó các bean doanh nghiệp có thể được thử nghiệm trong môi trường giả để tất cả các tài nguyên/hạt và như vậy được tiêm cục bộ. Các bean doanh nghiệp không cần phải thực hiện điều này. Tất cả các loại tiêm nên được hỗ trợ.Cách tốt nhất để kiểm tra đơn vị thành phần EJB3 mà không phải triển khai thành phần

  • Tôi muốn có trình cắm maven cho việc này để các bài kiểm tra có thể chạy từ bản dựng maven.
  • Giao dịch là không cần thiết trong các thử nghiệm đơn vị, điều này sẽ yêu cầu hoàn thành vùng chứa.

Bạn có biết plugin hoặc khung kiểm tra maven như vậy không? Kinh nghiệm với nó?

Trả lời

12

Không nhất thiết phải là cách dễ nhất, nhưng tôi quản lý để có được điều này làm việc sử dụng thùng chứa EJB3.0 nhúng JBoss, với sự hỗ trợ lớn từ Java Persistence with Hibernate

Đối với một sự khởi đầu, tôi không biết các plugin maven/phụ thuộc cho điều này , vì vậy tôi đã phải cài đặt riêng tôi tại địa phương:

(1) Tải jboss-EJB-3.0_Embeddable_ALPHA_9.zip từ downloads

(2) zipfile này chứa hai lọ quan trọng:

  • jboss-ejb3-all.jar
  • thirdparty-all.jar

(3) Cài đặt các lọ vào kho lưu trữ địa phương của bạn (sử dụng tên viết tắt của riêng bạn thay vì nkl):

mvn install:install-file \ 
    -Dfile=jboss-ejb3-all.jar \ 
    -DgroupId=nkl.jboss.embedded \ 
    -DartifactId=jboss-ejb3-all \ 
    -Dversion=3.0-alpha-9 

mvn install:install-file \ 
    -Dfile=thirdparty-all.jar \ 
    -DgroupId=nkl.jboss.embedded \ 
    -DartifactId=thirdparty-all \ 
    -Dversion=3.0-alpha-9 

(4) Nếu tất cả đã diễn ra tốt đẹp, bây giờ bạn sẽ có hai thư mục trong kho lưu trữ cục bộ của bạn.

(5) Bây giờ thêm sự phụ thuộc sau đây để bạn pom.xml

<dependency> 
     <groupId>nkl.jboss.embedded</groupId> 
     <artifactId>jboss-ejb3-all</artifactId> 
     <version>3.0-alpha-9</version> 
    </dependency> 
    <dependency> 
     <groupId>nkl.jboss.embedded</groupId> 
     <artifactId>thirdparty-all</artifactId> 
     <version>3.0-alpha-9</version> 
    </dependency> 

(6) Tôi cũng cần thiết để thêm phụ thuộc cho HSQLDB, và SLF4J

(7) Bạn cần phải sao chép một số tập tin từ thư mục conf của tệp zip vào thư mục src/main/resources của dự án của bạn:

  • default.persistence.properties
  • ejb3-interceptors-aop.xml
  • embedded-jboss-beans.xml
  • jndi.properties

(8) Tôi tạo của riêng tôi beans.xmlpersistence.xml file trong src/main/resources/META-INF:

<?xml version="1.0" encoding="UTF-8"?> 
<deployment xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="urn:jboss:bean-deployer bean-deployer_1_0.xsd" xmlns="urn:jboss:bean-deployer"> 
    <bean name="messageDSBootstrap" class="org.jboss.resource.adapter.jdbc.local.LocalTxDataSource"> 
    <property name="jndiName">java:/messageDS</property> 
    <property name="driverClass">org.hsqldb.jdbcDriver 
    </property> 
    <property name="connectionURL">jdbc:hsqldb:test</property> 
    <property name="minSize">0</property> 
    <property name="maxSize">10</property> 
    <property name="blockingTimeout">1000</property> 
    <property name="idleTimeout">30000</property> 
    <property name="transactionManager"> 
     <inject bean="TransactionManager" /> 
    </property> 
    <property name="cachedConnectionManager"> 
     <inject bean="CachedConnectionManager" /> 
    </property> 
    <property name="initialContextProperties"> 
     <inject bean="InitialContextProperties" /> 
    </property> 
    </bean> 
    <bean name="messageDS" class="java.lang.Object"> 
    <constructor factoryMethod="getDatasource"> 
     <factory bean="messageDSBootstrap" /> 
    </constructor> 
    </bean> 
</deployment> 

<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
    http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" 
    version="1.0"> 
    <persistence-unit name="jpa"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <jta-data-source>java:/messageDS</jta-data-source> 
    <properties> 
     <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect" /> 
     <property name="hibernate.show_sql" value="true" /> 
     <property name="hibernate.format_sql" value="true" /> 
     <property name="hibernate.hbm2ddl.auto" value="create" /> 
    </properties> 
    </persistence-unit> 
</persistence> 

(9) Tôi tạo ra một thử nghiệm đơn vị như theo dõi, sử dụng thông tin bổ sung từ here.

package org.nkl; 

import java.io.File; 

import javax.naming.InitialContext; 

import org.jboss.ejb3.embedded.EJB3StandaloneBootstrap; 
import org.jboss.ejb3.embedded.EJB3StandaloneDeployer; 
import org.junit.Test; 
import org.nkl.model.MessageHandler; 

public class BasicTest { 

    @Test 
    public void testEjb() throws Exception { 
     EJB3StandaloneBootstrap.boot(null); 
     EJB3StandaloneBootstrap.deployXmlResource("META-INF/beans.xml"); 
     EJB3StandaloneDeployer deployer = EJB3StandaloneBootstrap 
       .createDeployer(); 

     deployer.getArchives().add(new File("target/classes").toURI().toURL()); 

     deployer.create(); 
     deployer.start(); 
     InitialContext context = new InitialContext(); 
     MessageHandler messageHandler = (MessageHandler) context 
       .lookup("MessageHandlerBean/local"); 
     messageHandler.saveMessages(); 
     messageHandler.showMessages(); 
     EJB3StandaloneBootstrap.shutdown(); 
    } 
} 

(10) này sử dụng một SLSB đơn giản như:

package org.nkl.ejb; 

import java.util.List; 

import javax.ejb.Stateless; 
import javax.persistence.EntityManager; 
import javax.persistence.PersistenceContext; 

import org.nkl.model.Message; 
import org.nkl.model.MessageHandler; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

@Stateless 
public class MessageHandlerBean implements MessageHandler { 

    @PersistenceContext 
    private EntityManager em; 

    Logger logger = LoggerFactory.getLogger(MessageHandlerBean.class); 

    public void saveMessages() { 
     logger.info("In saveMessages"); 
     em.persist(new Message("Hello World")); 
    } 

    @SuppressWarnings("unchecked") 
    public void showMessages() { 
     logger.info("In showMessages"); 
     List messages = em.createQuery(
       "select m from Message m order by m.text asc").getResultList(); 
     for (Object o : messages) { 
      logger.info(((Message) o).getText()); 
     } 
    } 
} 

(11) Và một lớp tin thực thể như:

package org.nkl.model; 

import javax.persistence.CascadeType; 
import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.Id; 
import javax.persistence.JoinColumn; 
import javax.persistence.ManyToOne; 
import javax.persistence.Table; 

@Entity 
@Table(name = "MESSAGES") 
public class Message { 
    @Id 
    @GeneratedValue 
    @Column(name = "MESSAGE_ID") 
    private Long id; 
    @Column(name = "MESSAGE_TEXT") 
    private String text; 
    @ManyToOne(cascade = CascadeType.ALL) 
    @JoinColumn(name = "NEXT_MESSAGE") 
    private Message nextMessage; 

    public Message(String text) { 
     this.text = text; 
    } 

    Message() {} 

    // setters/getters not shown. 

} 

Cho phép chỉ nói có một số lượng các trở ngại trong quá trình tiếp cận này.

Đáng chú ý là phải làm theo thứ tự phụ thuộc.

Chúc may mắn !!

+1

để thực hiện kiểm tra đơn vị, cần thực hiện bên ngoài vùng chứa? –

+0

tất cả những điều này không làm việc trên jbossAS7 cả. Dường như cuốn sách giờ đã quá lỗi thời. Bạn có biết cách làm cho nó hoạt động trên JBoss AS 7 không? Cụ thể là tôi không thể tìm thấy bất kỳ giải pháp thay thế nào cho 'EJB3StandaloneBootstrap.deployXmlResource' – linuxeasy

4

Tôi phải cảnh báo rằng JBoss được nhúng là một mớ hỗn độn. Bạn không cần phải tin lời của tôi. Xem các diễn đàn cho chính bạn. Nó là alpha bởi tất cả các phương tiện có thể. Mọi thứ có thể làm việc cho bạn ngay bây giờ nhưng ai biết được những lỗi nào đang chờ đợi ở đó ... Giả sử rằng dự án của bạn sẽ tồn tại trong một thời gian dài .. đó là một nguy cơ.

Bạn có thể thử OpenEJB. Nó được giới hạn ở một số khía cạnh (về tính linh hoạt) nhưng nó thực sự dễ sử dụng và hoàn toàn phù hợp với thông số kỹ thuật. Có một số liên kết như thisthis. Tải xuống và thử. Nhân tiện, OpenEJB đã thu hút sự chú ý của tôi bằng cách đọc các bài đăng trên diễn đàn đã nhúng của JBoss ... từ những lựa chọn thay thế cho người dùng tức giận.

Cá nhân, tôi quyết định tạo cho các dự án của mình một loại container giả cho phép tôi kiểm tra hầu hết mọi thứ tôi cần. Đối với persistence tôi sử dụng Hibernate Entity Manager + HSQL. Tôi mất một tuần để thực hiện nhưng các nhóm của tôi (2 cho đến nay) rất hài lòng với nó. Tôi sẽ làm cho nó mã nguồn mở nếu có thể.

Tùy chọn cuối cùng là ejb3unit.

+0

Tôi quan tâm đến việc xem hoạt động khai thác thử nghiệm của bạn trông như thế nào nếu có thể. – cwash

Các vấn đề liên quan