我正在尝试实施 JUnit 测试以检查DAO的功能。(DAO将创建/读取基本的对象/表关系)。
我遇到的麻烦是DAO的持久性(对于非测试代码)是通过使用 Spring / Hibernate
的内部解决方案完成的,该解决方案消除了*.hbm.xml
我发现的大多数示例所包含的常用模板。
因此,我在理解如何设置 JUnit 测试以实现DAO来创建/读取(只是非常基本的功能)内存 HSQLDB方面
遇到了一些麻烦。我找到了一些示例,但是内部持久性的使用意味着我无法扩展示例显示的某些类(我似乎无法正确设置application-
context.xml设置)。
谁能建议我可以查看的任何项目/示例(或任何文档),以加深我对实现此测试功能的最佳方法的理解?我觉得这应该很简单,但是在实施所发现的示例时,我一直遇到问题。
编辑:
这是我的解决方案,可提高可读性,适合任何需要帮助的人:
TestClass
: @RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:applicationContextTest-Example.xml")
@Transactional
public class ExampleDaoTest extends AbstractTransactionalJUnit4SpringContextTests {
@Resource(name = "sessionFactory")
private SessionFactory exampleSessionFactory;
@Resource(name = "exampleDao")
private ExampleDao exampleDao;
applicationContext.xml
档案: <!-- List of Daos to be tested -->
<bean id="exampleDao" class="org.myExample.ExampleDao"/>
<!-- Datasource -->
<bean id="example_dataSource"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="org.hsqldb.jdbcDriver"/>
<property name="url" value="jdbc:hsqldb:mem:ExampleTest"/>
<property name="username" value="sa"/>
<property name="password" value=""/>
</bean>
<!-- Session Factory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="example_dataSource"/>
<property name="annotatedClasses">
<list>
<value>org.myExample.ExampleClass</value>
</list>
</property>
<property name="hibernateProperties">
.... left to user to choose properties
</property>
</bean>
Spring 3提供了一个新的jdbc
名称空间,其中包括对嵌入式数据库(包括HSQLDB)的支持。这样就可以解决这一部分。
我想知道什么是“内部解决方案”。您可以使用批注(JPA或Hibernate批注)对您的域对象进行ORM,那么为什么需要“内部解决方案”?例如:
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"
p:dataSource-ref="dataSource"
p:packagesToScan="myapp.model" />
就实施测试而言,请使用Spring的TestContext Framework。测试看起来可能是这样的(再次假设我在下面的Spring
3中运行,尽管只需将@Inject更改为@Autowired即可在Spring 2.5中运行):
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({
"/beans-datasource-it.xml",
"/beans-dao.xml",
"/beans-service.xml",
"/beans-web.xml" })
@Transactional
public class ContactControllerIT {
@Inject private ContactController controller;
... setUp() and tearDown() ...
@Test
public void testGetContact() {
String viewName = controller.getContact(request, 1L, model);
... assertions ...
}
}
例如,您会将嵌入式数据库放入其中beans-datasource-it.xml
。(这里的“
it”代表集成测试,文件位于类路径中。)本示例中的控制器位于中beans-web.xml
,并将自动连接到该ContactController
字段中。
那只是做什么的概述,但希望足以让您入门。
DAO类的相关方面如下 我的src/test/resources/application.properties文件如下所示 在Eclipse中作为JUnit测试运行的跟踪 应用程序结构 -SRC ----application.java ----COM ----Hitstpa ----application.properties --测试 ---爪哇
customer-Mapper.xml daoimpl.java
尝试让JUnit与mockito测试一起工作,并在我的测试中获得NPE。我想验证一下,当调用时,紧接着调用了方法。我觉得奇怪的一个问题是,在Mockito上。验证(registrationServiceImpl,Mockito.times(1))。创建注册人(registrationDTO) 方法?IntelliJ只建议界面中的方法? 我的测试代码如下: 下面是我正在测试的代码:
我正在使用JUnit测试一个DAO类,我得到了一个nullpointerexception,我不知道为什么要启动服务类。以下是测试类: 以下是UserDaoImpl 如何在测试类中注入类?我想nullpointerxeception的原因是dao类没有正确地注入到测试类中
问题内容: 如果有什么问题请指正。 现在,当我们将Spring DAO用于ORM模板时,当我们使用@Transactional属性时,从外部而不是在方法内部调用该方法时,我们将无法控制事务和/或会话。 延迟加载可节省资源-减少对数据库的查询,减少将所有集合保持在应用程序内存中的内存。 因此,如果lazy = false,则在链接集中有10,000条记录的情况下,所有相关联的集合都将被提取,这并不是
我有DaoImpl类: 我的测试是: 测试是成功的,但是当我运行具有覆盖率的junit测试时,它显示方法没有被覆盖,因此我的整体单元测试行覆盖率低于要求。我们能涵盖那部分吗?如果是,我们怎么做?谢了。