gpt4 book ai didi

jpa - 使用 JUnit 测试 EJB

转载 作者:行者123 更新时间:2023-12-03 07:13:18 25 4
gpt4 key购买 nike

我应该如何测试注入(inject) EntityManager 实例的 EJB 3.1?

可能的 EJB:

@Stateless
@LocalBean
public class CommentService {

@PersistenceContext
private EntityManager em;

public List<Comment> findAll() {
TypedQuery<Comment> query = em.createNamedQuery(
Comment.FIND_ALL, Comment.class
);
return query.getResultList();
}

}

可能的测试:

@Test
public void testFindAll() {
List<Comment> all = service.findAll();
Assert.assertEquals(8, all.size());
}

我仅使用适用于 Java EE 开发人员的 GlassFish 3.1 和 Eclipse Indigo。我已经尝试过类似的事情:

@Before
public void setUp() throws Exception {
ejbContainer = EJBContainer.createEJBContainer();
service = (CommentService) ejbContainer.getContext()
.lookup("java:global/classes/CommentService");
}

但我得到的只是:

javax.ejb.EJBException:
No EJBContainer provider available: no provider names had been found.

最佳答案

接受的答案需要模拟大量代码,包括持久层。使用嵌入式容器来测试实际的bean;否则,模拟持久层会导致代码几乎无法测试任何有用的东西。

将 session bean 与引用持久性单元的实体管理器一起使用:

@Stateless
public class CommentService {

@PersistenceContext(unitName = "pu")
private EntityManager em;

public void create(Comment t) {
em.merge(t);
}

public Collection<Comment> getAll() {
Query q = em.createNamedQuery("Comment.findAll");
Collection<Comment> entities = q.getResultList();
return entities;
}
}

实体bean:

@Entity
@NamedQueries({@NamedQuery(name = "Comment.findAll", query = "select e from Comment e")})
public class Comment implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}
}

此持久单元在 persistence.xml 文件中定义如下:

<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">

<persistence-unit name="pu" transaction-type="JTA">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<class>org.glassfish.embedded.tempconverter.Comment</class>
<properties>
<property name="eclipselink.ddl-generation" value="drop-and-create-tables"/>
</properties>
</persistence-unit>
</persistence>

事务类型必须是JTA

然后编写一个创建和销毁 EJB 容器(GlassFish 嵌入式容器)的测试:

public class CommentTest extends TestCase {

private Context ctx;
private EJBContainer ejbContainer;

@BeforeClass
public void setUp() {
ejbContainer = EJBContainer.createEJBContainer();
System.out.println("Opening the container" );
ctx = ejbContainer.getContext();
}

@AfterClass
public void tearDown() {
ejbContainer.close();
System.out.println("Closing the container" );
}

public void testApp() throws NamingException {

CommentService converter = (CommentService) ctx.lookup("java:global/classes/CommentService");
assertNotNull(converter);

Comment t = new Comment();
converter.create(t);
t = new Comment();
converter.create(t);
t = new Comment();
converter.create(t);
t = new Comment();
converter.create(t);

Collection<Comment> ts = converter.getAll();

assertEquals(4, ts.size());
}
}

接下来,添加两个依赖项(例如 Maven POM):

<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8.2</version>
<scope>test</scope>
<type>jar</type>
</dependency>
<dependency>
<groupId>org.glassfish.main.extras</groupId>
<artifactId>glassfish-embedded-all</artifactId>
<version>3.1.2</version>
<scope>compile</scope>
</dependency>

拥有依赖项 session 实体 bean、持久性文件、测试 文件完全按照所示实现,那么测试应该通过。 (互联网上的例子远远不够。)

关于jpa - 使用 JUnit 测试 EJB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6469751/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com