MDA/MDD/TDD/DDD/DDDDDDD
posts - 536, comments - 111, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

spring2.5与junit整合的笔记

Posted on 2009-01-04 18:13 leekiang 阅读(1903) 评论(0)  编辑  收藏 所属分类: spring测试
1,为了尽量平稳过渡,继续用junit3.8,而不是直接使用junit4
2,@ContextConfiguration(locations = { "classpath:applicationContext-sys.xml",
        "classpath:applicationContext.xml" })
public class BaseTests extends AbstractTransactionalJUnit38SpringContextTests {
}
所有的TestCase都继承上面这个类,使得spring配置文件重用,同时ApplicationContext也是同一个。

3,要测试的service类通过@Autowired注入,例如
    @Autowired
    private UserDAO  userDAO;
    
4,注意,对于继承了BaseTests的测试类里的每一个test方法,运行测试时都会按
   setUp()-->test方法-->tearDown()的顺序执行,而且这3个组成一个事务,执行完后默认会回滚。
   如果不想回滚,在类名前面@TransactionConfiguration(defaultRollback = false)
   
5,因为还是用的junit3.8,故TestSuite的写法照旧
  public class SuiteTests {
    public static Test suite() {
        TestSuite suite = new TestSuite("运行所有测试");
        suite.addTestSuite(UserServiceTests.class);
        suite.addTestSuite(RoleServiceTests.class);
        return suite;
    }
}

6,测试类并没有当作bean配置在application.xml文件中,
   spring测试框架是如何使"setUp()-->test方法-->tearDown()"处于同一个事务的呢?
   具体就要看AbstractTransactionalJUnit38SpringContextTests了,是通过注解实现的。
   service方法在test方法里面,这两个方法都配置有事务,即形成了事务的嵌套,这里有点复杂了,我还没想清楚。
   不过可以肯定的是,如果test方法的事务不提交,那么service方法的事务也不会提交。
   
7,如果想在jdk1.4下重用ApplicationContext,可采用以下的办法,出处再补上。这个办法与前面的进行比较,
   我觉得最大的区别是这种写法要手动进行测试数据的清除。
public class BaseTestCase extends TestCase {
     static ApplicationContext context = null;

    static {
        // perform the "global" set up logic
        // 这里的代码会在类初始化时执行,所以相当于BeforeClass
        String[] CONFIG_FILES_MIN = { "applicationContext-sys.xml",
                "applicationContext.xml" };
        context = new ClassPathXmlApplicationContext(CONFIG_FILES_MIN);
        System.out.println("setup");

        // and now register the shutdown hook for tear down logic
        // 将一个匿名方法写到这里,就相当于AfterClass
        Runtime.getRuntime().addShutdownHook(new Thread() {
            public void run() {
                System.out.println("shutdown");
            }
        });
    }

    protected void setUp() throws Exception {
    }
}

8,如果用junit-4.jar,去官网下载junit4.4.jar。不要采用myeclipse自带的junit4.jar,因为这个不带JUnit4ClassRunner类。
   另外不要用junit-4.5.jar,据说与spring2.5有冲突,
   详见Spring Test Context Framework not compatible with JUnit 4.5,http://jira.springframework.org/browse/SPR-5145


9,String htmlContent = "<html><head></head><body>html content</body></html>";
String plainContent = "plain content";

MockMultipartHttpServletRequest req = new MockMultipartHttpServletRequest();
req.setContentType("multipart/form-data");
//req.addHeader("Content-type", "multipart/form-data");//这样写应该是一样的
req.setMethod("POST");
req.addFile( new MockMultipartFile("file","test1.html","text/html", htmlContent.getBytes( "US-ASCII" ) ) );
req.addFile( new MockMultipartFile("file","test2.html","text/html", htmlContent.getBytes( "US-ASCII" ) ) );
req.addFile( new MockMultipartFile("file","test.txt", "text/plain",plainContent.getBytes( "US-ASCII" ) ) );
assertTrue( ServletFileUpload.isMultipartContent( req ) );
int content_length = req.getContentLength();

10,AbstractTransactionalJUnit38SpringContextTests
    AbstractTransactionalSpringContextTests
    AbstractTransactionalDataSourceSpringContextTests
的区别?

11,MockHttpServletRequest的addParameter方法和setParameter的区别


参考:
详细讲解在Spring中进行集成测试
http://www.javaeye.com/topic/68185
http://www.google.cn/codesearch/p?hl=zh-CN#Vq-IOboH1tI/trunk/test/es/peerreview/service/TestPeerReviewSpring.java
用Spring提供的JUnit框架扩展对DAO或Service层进行单元测试
http://code.google.com/p/anewssystem/source/browse/trunk/anewssystem/parent/core/src/main/java/anni/core/test/?r=105
http://docs.huihoo.com/spring/2.5.x/zh-cn/testing.html
http://arkxu.javaeye.com/blog/261679
http://www.ibm.com/developerworks/cn/java/j-cb06066.html
http://www.ibm.com/developerworks/cn/java/j-lo-spring25-test/
基于mock对象和JUnit框架简化Spring Web组件单元测试
http://www.blogjava.net/calvin/archive/2005/09/21/13628.html
http://www.yybean.com/testing-framework-to-use-spring-integration-testing



只有注册用户登录后才能发表评论。


网站导航: