gpt4 book ai didi

java - 如何使用 JPA 实现测试 DAO?

转载 作者:行者123 更新时间:2023-11-28 20:21:21 25 4
gpt4 key购买 nike

我是Spring夏令营过来的,不想用Spring,正在迁移到JavaEE6,但我在测试 DAO + JPA 时遇到问题,这是我的简化示例:

public interface PersonDao
{
public Person get(long id);
}

这是一个非常基础的DAO,因为我是Spring过来的,我相信DAO还是有它的值(value)的,所以我决定加一个DAO层。

public class PersonDaoImpl implements PersonDao , Serializable
{
@PersistenceContext(unitName = "test", type = PersistenceContextType.EXTENDED)
EntityManager entityManager ;

public PersonDaoImpl()
{
}

@Override
public Person get(long id)
{
return entityManager .find(Person.class , id);
}
}

这是一个 JPA 实现的 DAO,我希望 EE 容器或测试容器能够注入(inject) EntityManager(就像 Spring 一样)。

public class PersonDaoImplTest extends TestCase
{
@Inject
protected PersonDao personDao;

@Override
protected void setUp() throws Exception
{
//personDao = new PersonDaoImpl();
}

public void testGet()
{
System.out.println("personDao = " + personDao); // NULL !
Person p = personDao.get(1L);
System.out.println("p = " + p);
}
}

这是我的测试文件。

OK,问题来了:因为 JUnit 不理解 @javax.inject.Inject ,PersonDao 将无法注入(inject),测试将失败。

如何找到能够将 EntityManager 注入(inject)到 PersonDaoImpl 并将 PersonDaoImpl @Inject 到 TestCase 的 PersonDao 的测试框架?

我试过 unitils.org ,但找不到这样的示例,它只是直接将 EntityManagerFactory 注入(inject) TestCast ,而不是我想要的......

最佳答案

because I came from Spring, I believe DAO still has its value, so I decided to add a DAO layer.

我真的不明白 Spring 与此有什么关系。我不同意as I wrote in a previous answer .对我来说,JPA 是一个 DAL(数据访问层),我看不出将一个数据访问层放在另一个数据访问层之上有什么意义。至少不是系统地。但我们先不讨论这个。

This is a JPA-implemented DAO , I hope the EE container or the test container able to inject the EntityManager (just like Spring does).

如果您的 DAO 是像 CDI 托管 bean 这样的托管组件,那么 Java EE 容器应该能够在其中注入(inject) EntityManager

对于容器管理对象的单元测试,您不需要任何类型的容器。对于集成测试,您将需要某种容器,就像您对 Spring bean、Hibernate/JPA 实体、 session bean、CDI 管理的 bean 或任何其他类型的容器管理的对象所做的那样。你可以 use the EJB3.1 embeddable API in your tests .也看看 Arquillian .

关于java - 如何使用 JPA 实现测试 DAO?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2487275/

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