sma*_*ufo 1 java testing dao jpa cdi
我来自Spring阵营,我不想使用Spring,并且正在迁移到JavaEE6,但我测试DAO + JPA有问题,这是我的简化示例:
public interface PersonDao
{
public Person get(long id);
}
Run Code Online (Sandbox Code Playgroud)
这是一个非常基本的DAO,因为我来自Spring,我相信DAO仍然有它的价值,所以我决定添加一个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);
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个JPA实现的DAO,我希望EE容器或测试容器能够注入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);
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的测试文件.
好的,问题就出现了:因为JUnit不理解@javax.inject.Inject,PersonDao将无法注入,测试将失败.
如何找到能够将EntityManager注入PersonDaoImpl的测试框架,并将PersonDaoImpl注入到TestCase的PersonDao中?
我试过了unitils.org,但找不到像这样的样本,只是直接将EntityManagerFactory注入TestCast,而不是我想要的......
因为我来自Spring,我相信DAO仍然有它的价值,所以我决定添加一个DAO层.
我真的没看到Spring和它有什么关系.我不同意我在之前的回答中所写的内容.对我来说,JPA是一个DAL(数据访问层),我没有看到将数据访问层置于另一个数据访问层之上的重点.至少不系统.但我们不讨论这个问题.
这是一个JPA实现的DAO,我希望EE容器或测试容器能够注入EntityManager(就像Spring一样).
如果您的DAO是像CDI托管bean这样的托管组件,那么Java EE容器应该能够注入EntityManager
其中.
对于容器管理对象的单元测试,您不需要任何类型的容器.对于集成测试,您将需要某种容器,就像您对Spring bean,Hibernate/JPA实体,会话bean,CDI托管bean或任何其他类型的容器管理对象一样.您可以在测试中使用EJB3.1可嵌入API.还可以看看Arquillian.
归档时间: |
|
查看次数: |
9820 次 |
最近记录: |