最近公司在抓代碼質量,要求新老項目整合Junit5,H2內存數據庫;新項目都是springboot的整合起來還是方便的,老項目整起來就頭疼了,老項目是Jodd框架弄的tomcate web項目,整合時花了些心思,特此記錄一下。
我們都知道在測試之前需要初始化項目加載一些bean、數據源等資源,在springboot中一個註解就可以搞定——@SpringBootTest,只需要標註在測試類上就能注入spring管理的bean、service來使用了。然而老項目並不能這樣弄,後來通過不斷的找資料,發現Junit的測試類測試方法是可以主動觸發的,那這樣一來事情不就簡單多了嘛——在項目啓動完成之後主動觸發一下就ok了
Junit4主動觸發示例
Result result = JUnitCore.runClasses(OrderTest.class); //OrderTest是測試類
Junit5主動觸發示例:
LauncherDiscoveryRequest request = LauncherDiscoveryRequestBuilder.request() .selectors( selectPackage("test/junit/suite") //配置測試類所在目錄 //selectClass(OrderTest.class), //配置測試類 //selectMethod(OrderTest.class,"testOrderPay") //配置測試類測試方法 ) .filters( includeClassNamePatterns(".*Test") //測試類名稱過濾器 //防盜標記 開源中國 爲何不可1995 ).build(); Launcher launcher = LauncherFactory.create(); TestExecutionListener listener = new SummaryGeneratingListener(); launcher.registerTestExecutionListeners(listener); launcher.execute(request);
配置H2數據庫,引入jar包 h2-2.1.214.jar,配置好數據源,使用原生jdbc初始化測試時需要的用到的建表語句及初始insert數據,數據庫初始化之後就可以開始測試了~
Class.forName("org.h2.Driver"); Connection conn = DriverManager.getConnection( //mem表示本地內存啓動h2,test是數據庫名稱,mode=mysql表示使用mysql模型 "jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;IGNORECASE=TRUE;DB_CLOSE_ON_EXIT=TRUE;MODE=MYSQL", "username", "passward"); for (int i = 0; i < schemas.size(); i++) { //schemas是自定義的初始化建表語句List,inserts是初始化數據List Statement statement1 = conn.createStatement(); statement1.execute(schemas.get(i)); } for (int i = 0; i < inserts.size(); i++) { Statement statement1 = conn.createStatement(); statement1.execute(inserts.get(i)); }//防盜標記 開源中國 爲何不可1995 conn.commit(); conn.close();
項目的數據源配置context.xml內容:
<?xml version="1.0" encoding="UTF-8"?> <Context path="/"> <Resource name="jdbc/xxx" auth="Container" type="javax.sql.DataSource" maxTotal="100" maxIdle="30" maxWaitMillis="300000" username="xxx" password="xxx" driverClassName="org.h2.Driver" testWhileIdle="true" testOnBorrow="false" testOnReturn="false" validationQuery="select 1" validationQueryTimeout="1" timeBetweenEvictionRunsMillis="1802300" numTestsPerEvictionRun="100" url="jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;IGNORECASE=TRUE;DB_CLOSE_ON_EXIT=TRUE;MODE=MYSQL"/> </Context>