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 閱讀(1910) 評論(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.aygfsteel.com/calvin/archive/2005/09/21/13628.html
          http://www.yybean.com/testing-framework-to-use-spring-integration-testing


          主站蜘蛛池模板: 滁州市| 合肥市| 卢湾区| 永靖县| 新营市| 务川| 南郑县| 连云港市| 磴口县| 鹤壁市| 荥阳市| 湟中县| 响水县| 宁化县| 南岸区| 中江县| 永福县| 海伦市| 喀喇沁旗| 金寨县| 洞头县| 长岭县| 奈曼旗| 白玉县| 南投县| 沙坪坝区| 郸城县| 东方市| 分宜县| 洛浦县| 鱼台县| 宁城县| 封开县| 科技| 铜山县| 五河县| 讷河市| 独山县| 嘉义市| 盖州市| 城步|