MDA/MDD/TDD/DDD/DDDDDDD
          posts - 536, comments - 111, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          spring2.5與junit整合的筆記

          Posted on 2009-01-04 18:13 leekiang 閱讀(1910) 評論(0)  編輯  收藏 所屬分類: spring測試
          1,為了盡量平穩(wěn)過渡,繼續(xù)用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()的順序執(zhí)行,而且這3個組成一個事務,執(zhí)行完后默認會回滾。
          ?? 如果不想回滾,在類名前面@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了,是通過注解實現(xiàn)的。
          ?? service方法在test方法里面,這兩個方法都配置有事務,即形成了事務的嵌套,這里有點復雜了,我還沒想清楚。
          ?? 不過可以肯定的是,如果test方法的事務不提交,那么service方法的事務也不會提交。
          ? ?
          7,如果想在jdk1.4下重用ApplicationContext,可采用以下的辦法,出處再補上。這個辦法與前面的進行比較,
          ?? 我覺得最大的區(qū)別是這種寫法要手動進行測試數(shù)據(jù)的清除。
          public class BaseTestCase extends TestCase {
          ?? ? static ApplicationContext context = null;

          ?? ?static {
          ?? ??? ?// perform the "global" set up logic
          ?? ??? ?// 這里的代碼會在類初始化時執(zhí)行,所以相當于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,去官網(wǎng)下載junit4.4.jar。不要采用myeclipse自帶的junit4.jar,因為這個不帶JUnit4ClassRunner類。
          ?? 另外不要用junit-4.5.jar,據(jù)說與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
          的區(qū)別?

          11,MockHttpServletRequest的addParameter方法和setParameter的區(qū)別


          參考:
          詳細講解在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


          主站蜘蛛池模板: 高淳县| 潼南县| 湟源县| 建宁县| 漳平市| 通道| 利川市| 望都县| 桃源县| 河西区| 东明县| 旅游| 昌黎县| 湛江市| 美姑县| 陇川县| 渭源县| 万全县| 华亭县| 黎城县| 临猗县| 江口县| 如东县| 土默特右旗| 卢氏县| 浦北县| 五河县| 连南| 胶南市| 文化| 平南县| 洪洞县| 保山市| 上杭县| 祁阳县| 家居| 游戏| 藁城市| 铁力市| 漠河县| 建湖县|