gpt4 book ai didi

java - 无状态 ejb + jpa 的 junit 测试

转载 作者:行者123 更新时间:2023-11-30 07:38:14 25 4
gpt4 key购买 nike

我想为我的无状态 ejb + jpa 演示代码编写一个 junit 测试。我认为这实际上不是一个junit测试,它是一个集成测试。

我有一个带有注入(inject)的 EntityManager 的无状态 ejb,并且使用了 PostgreSQL 数据库服务器。我使用 CDI(我的项目中未使用 Spring)和 EclipseLink 以及 persistence.xml 文件。我的应用程序将在 GlassFish 服务器上执行。

我想编写一个测试来检查完整的逻辑:在我的示例无状态 ejb 上调用一个方法并将数据保存到内存数据库中。我想通过我的测试启动内存数据库,并在执行我的测试类时停止它。

ejb 类:

@Stateless
public class PropertyServiceImpl implements PropertyService {

@PersistenceContext(name = "anything-jndi-em")
private EntityManager em;

public String getStringValue(final String key) {
Property property = em.createNamedQuery("Property.findByKey", Property.class)
.setParameter("key", key)
.getSingleResult();

return property.getValue();
}
}

实体类:

@Entity
@Table(name = "APPLICATION_SETTING")
@NamedQueries({
@NamedQuery(name = "Property.findByKey", query = "select a from Property a where a.key = :key and a.status = 1")
})
public class Property
{
@Id
@SequenceGenerator(name = "APPLICATION_SETTING_SEQ", sequenceName = "APPLICATION_SETTING_SEQ", allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "APPLICATION_SETTING_SEQ")
@Column(name = "ID", unique = true, nullable = false)
private Long id;

@Column(name = "KEY", length = 200, nullable = false)
private String key;
...
}

如果我是正确的,我需要执行以下步骤:

  1. 使用正确的 jdbc 连接参数创建一个新的 permanent.xml 文件,该文件将连接到内存数据库并将其放在/test/Resources/META-INF 文件夹下
  2. 为内存数据库(例如:hsqldb)和嵌入式 ejb 容器添加一些 pom 依赖项
  3. 创建一个简单的 PropertyServiceImplTest.java 类
  4. 以某种方式配置/test/Resources/META-INF/persistent.xml 文件将由我的测试类使用
  5. 初始化嵌入式ejb容器并启动内存数据库
  6. 执行我的juni测试方法:

@测试
公共(public)无效testGetStringValue(){
PropertyService 服务 = new PropertyServiceImpl();
assertNotNull(service.getStringValue("abc"));
}

你能帮我为这个场景编写一个合适的测试java类吗?

最佳答案

我强烈推荐Arquillian 。我在 Wildfly 8、9 和 10 上将其与 gradle 一起使用。正确设置后(这可能有点困难),它会产生奇迹。

您只需像这样注释您的 JUnit 测试:

@RunWith(Arquillian.class)
public class MRSInjectionServiceTests extends ...

然后提供我通过 JBoss ShrinkWrap 完成的部署存档:

@Deployment
public static WebArchive createDeployment() {
return ShrinkWrap.create(ZipImporter.class, "MRSInjectionServiceTests.war").importFrom(new File(ROOT_WAR_DEPLOYMENT_LOCATION)).as(WebArchive.class);
}

然后您可以从 Maven 或 gradle 运行这些集成测试。 Arquillian 将根据您的配置运行您的应用程序服务器容器(Wildfly、GLassfish 等),并将在整个系统运行时将 JUnit 测试作为系统测试运行。

非常好。非常值得付出努力。

关于java - 无状态 ejb + jpa 的 junit 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35068113/

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