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方法,運(yùn)行測試時都會按
?? setUp()-->test方法-->tearDown()的順序執(zhí)行,而且這3個組成一個事務(wù),執(zhí)行完后默認(rèn)會回滾。
?? 如果不想回滾,在類名前面@TransactionConfiguration(defaultRollback = false)
? ?
5,因?yàn)檫€是用的junit3.8,故TestSuite的寫法照舊
? public class SuiteTests {
?? ?public static Test suite() {
?? ??? ?TestSuite suite = new TestSuite("運(yùn)行所有測試");
?? ??? ?suite.addTestSuite(UserServiceTests.class);
?? ??? ?suite.addTestSuite(RoleServiceTests.class);
?? ??? ?return suite;
?? ?}
}
6,測試類并沒有當(dāng)作bean配置在application.xml文件中,
?? spring測試框架是如何使"setUp()-->test方法-->tearDown()"處于同一個事務(wù)的呢?
?? 具體就要看AbstractTransactionalJUnit38SpringContextTests了,是通過注解實(shí)現(xiàn)的。
?? service方法在test方法里面,這兩個方法都配置有事務(wù),即形成了事務(wù)的嵌套,這里有點(diǎn)復(fù)雜了,我還沒想清楚。
?? 不過可以肯定的是,如果test方法的事務(wù)不提交,那么service方法的事務(wù)也不會提交。
? ?
7,如果想在jdk1.4下重用ApplicationContext,可采用以下的辦法,出處再補(bǔ)上。這個辦法與前面的進(jìn)行比較,
?? 我覺得最大的區(qū)別是這種寫法要手動進(jìn)行測試數(shù)據(jù)的清除。
public class BaseTestCase extends TestCase {
?? ? static ApplicationContext context = null;
?? ?static {
?? ??? ?// perform the "global" set up logic
?? ??? ?// 這里的代碼會在類初始化時執(zhí)行,所以相當(dāng)于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
?? ??? ?// 將一個匿名方法寫到這里,就相當(dāng)于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,因?yàn)檫@個不帶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");//這樣寫應(yīng)該是一樣的
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ū)別
參考:
詳細(xì)講解在Spring中進(jìn)行集成測試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框架擴(kuò)展對DAO或Service層進(jìn)行單元測試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.tkk7.com/calvin/archive/2005/09/21/13628.html
http://www.yybean.com/testing-framework-to-use-spring-integration-testing