1. Spring DAO层的测试AbstractTransactionalDataSourceSpringContextTests
2. spring2.5, 不知道为什么Junit4的风格用不了!!
Spring的DAO层的测试,我是通过继承AbstractTransactionalDataSourceSpringContextTests来做的。比较简单,而且又支持回滚,没有数据库的耗时操作,又是spring-test.jar发布包里直接支持的,所以就选个了。
代码实现也很简单,我先定义了一个base类,其他的测试类全部都继承这个base类,就更方便控制了。
public class BaseDAOTestCase extends AbstractTransactionalDataSourceSpringContextTests {
protected final static Log log = LogFactory.getLog(BaseDAOTestCase.class);
@Override
public String[] getConfigLocations() {
setAutowireMode(AUTOWIRE_BY_TYPE);
return new String[] { "classpath:/test-*-beans.xml", "classpath:/test-*-beans.xml" };
}
}
实现test的类:
package com.dvs.biz.dao.ibatis;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import com.dvs.biz.dao.UserDAO;
import com.dvs.biz.model.User;
import com.dvs.common.dao.ibatis.BaseDAOTestCase;
/**
*
* Now, Junit 3.8.1 version.
*
* But I hope everyone can also follow Junit4 coding style
*
*/
public class UserDAOIbatisTest extends BaseDAOTestCase {
private UserDAO userDao;
private User user;
private Integer pk;
private Integer pk2 = new Integer(1137799366);
public void setUserDAO(UserDAO userDao) {
this.userDao = userDao;
}
public UserDAOIbatisTest() {
pk = 12345678;
user = new User();
user.setAddress("aa");
user.setAge(12);
user.setPassword("aa");
user.setPk(pk);
user.setUsername("aa");
}
@Before
public void init() {
}
@Test
public void testGetList() {
try {
List list = userDao.getList();
User user1 = (User) list.get(0);
assertNotNull(user1.getPk());
} catch (Exception e) {
e.printStackTrace();
}
}
}
这个东西特别奇怪,spring2.5已经明确说了支持junit 4.4, 可是这个类里面写的 @Before, @Test就是没有作用。在spring中文论坛也问了,目前还没有反应呢。!!!
我查了spring的源代:
我的类叫BaseTest
extends AbstractTransactionalDataSourceSpringContextTests
extends AbstractTransactionalSpringContextTests
extends AbstractDependencyInjectionSpringContextTests
extends AbstractSingleSpringContextTests
extends AbstractSpringContextTests
extends ConditionalTestCase
extends TestCase
----------------
下边是ConditionalTestCase类的开头。
package org.springframework.test;
import junit.framework.TestCase;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* Superclass for JUnit 3.8 based tests that allows conditional test execution
* at the individual test method level. The
* {@link #isDisabledInThisEnvironment(String) isDisabledInThisEnvironment()}
* method is invoked before the execution of each test method. Subclasses can
* override that method to return whether or not the given test should be
* executed. Note that the tests will still appear to have executed and passed;
* however, log output will show that the test was not executed.
*
* @author Rod Johnson
* @since 2.0
* @see #isDisabledInThisEnvironment
*/
public abstract class ConditionalTestCase extends TestCase {
===================
上面写着,Superclass for JUnit 3.8 based tests 。请问这个是什么问题啊,是bug吗?还是怎么回事!!
我的在程序里的junit4.4规范代码运行不了,3.8规范的代码是OK.
--------------------------------------------------------------------------------------------------------
自己回复一下吧,找到解决办法了。
spirng2.5不用上面的类了,按下以下的形式,可以做junit4.4的单元测试了。
package com.dvs.common.dao.ibatis;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.transaction.TransactionConfiguration;
import org.springframework.transaction.annotation.Transactional;
/**
*
* @author Conan
*
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:/test-*-beans.xml" })
@TransactionConfiguration(transactionManager = "txManager", defaultRollback = true)
@Transactional
public class BaseDAOTestCaseJunit44 {
}
还有一个是子类:
package com.dvs.biz.dao.ibatis;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import com.dvs.biz.dao.UserDAO;
import com.dvs.biz.model.User;
import com.dvs.common.dao.ibatis.BaseDAOTestCaseJunit44;
/**
*
* @author Conan
*
*/
public class UserDAOIbatisTest extends BaseDAOTestCaseJunit44{
private UserDAO userDao;
private User user;
private Integer pk;
private Integer pk2 = new Integer(123);
@Autowired
public void setUserDAO(UserDAO userDao) {
this.userDao = userDao;
}
public UserDAOIbatisTest() {
pk = 1212;
user = new User();
user.setAddress("aa");
user.setAge(12);
user.setPassword("aa");
user.setPk(pk);
user.setUsername("12");
}
@Before
public void init() {
}
@Test
public void getList() {
try {
List list = userDao.getList();
User user1 = (User) list.get(0);
assertNotNull(user1.getPk());
} catch (Exception e) {
e.printStackTrace();
}
}
}
这样子就完成了,从Junit3.8向Junit4.4的转变。