1. 程式人生 > >spring 整合 junit

spring 整合 junit

這兩天做Web開發,發現通過Spring進行物件管理之後,做測試變得複雜了。因為所有的Bean都需要在applicationContext.xml中載入好,之後再通過@Resource去取得。如果每次都要整個業務流做的差不多了再去測試,這樣效率很低,也很麻煩。如果單獨去寫一個測試用類,這樣太繁瑣了。於是想起Spring有一個測試框架,能夠整合JUnit進行測試,於是便拿出來試試~

注意 本人使用的 是spring 4.04 ,junit 使用4.4。使用高版本的junit會報錯java.lang.NoSuchMethodError: org.junit.runner.notification.RunNotifier.testAborted

maven

		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.4</version>
		</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>2.

1. 加入依賴包

  使用Spring的測試框架需要加入以下依賴包

  • Spring Test (Spring框架中的test包)
  • Spring 相關其他依賴包(不再贅述了,就是context等包)

2. 建立測試源目錄和包

  在此,推薦建立一個和src平級的原始檔目錄,因為src內的類都是為日後產品準備的,而此處的類僅僅用於測試。而包的名稱可以和src中的目錄同名,這樣由於在test源目錄中,所以不會有衝突,而且名稱又一模一樣,更方便檢索。

3. 建立測試類

  建立一個測試用的類,推薦名稱為 “被測試類名稱 + Test”。

  測試類應該繼承與 AbstractJUnit4SpringContextTests

 或 AbstractTransactionalJUnit4SpringContextTests

  對於 AbstractJUnit4springcontextTests 和 AbstractTransactionalJUnit4SpringContextTests 類的選擇:

  如果再你的測試類中,需要用到事務管理(比如要在測試結果出來之後回滾測試內容),就可以使用AbstractTransactionalJUnit4SpringTests類。事務管理的使用方法和正常使用Spring事務管理是一樣的。再此需要注意的是,如果想要使用宣告式事務管理,即使用AbstractTransactionalJUnitSpringContextTests類,請在applicationContext.xml檔案中加入transactionManager bean:

<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>

 如果沒有新增上述bean,將會丟擲NoSuchBeanDefinitionException,指明 No bean named 'transactionManager' is definded.

4. 配置測試類

  新增如下內容在class前,用於配置applicationContext.xml檔案的位置。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:applicationContext.xml")

5. 建立測試方法

  建立測試用方法,推薦名稱為 “被測方法名稱+ Test”。

  測試方法上方加入 @Test

6. 通過JUnit 4 執行

  右鍵方法名,選擇則“Run As”→“JUnit Test”即可

附錄1:整體測試類檔案

複製程式碼
/* @(#) UserDaoTest.java
*
*/
package com.phj.dao;

import javax.annotation.Resource;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.phj.entity.User;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:applicationContext.xml")
//注意:此處不要@ContextConfiguration(locations = "classpath*:config/spring/*.xml"),spring會找不到配置檔案
//多檔案可以@ContextConfiguration(locations = { "classpath:spring1.xml", "classpath:spring2.xml"publicclass UserDaoTest extends AbstractJUnit4SpringContextTests {

@Resource
private UserDaoInterface userDao;

@Test
publicvoid saveTest() {

User user1 =
new User();
user1.setUsername("tom");
user1.setPassword("123456");
user1.setNickName("tom");
user1.setEmail("[email protected]");

User user2 =
new User();
user2.setUsername("admin");
user2.setPassword("123456");
user2.setNickName("admin");
user2.setEmail("[email protected]");

User user3 =
new User();
user3.setUsername("feihong");
user3.setPassword("123456");
user3.setNickName("phj");
user3.setEmail("[email protected]");

userDao.save(user1);
userDao.save(user2);
userDao.save(user3);
}
}

  OK,到此為止就可以使用Spring的測試框架了。

使用註解時,Junit報錯:

  1. java.lang.NoSuchFieldError: NULL  
  2.     at org.junit.runners.ParentRunner.<init>(ParentRunner.java:48)  
  3.     at org.junit.runners.BlockJUnit4ClassRunner.<init>(BlockJUnit4ClassRunner.java:59)  
  4.     at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.<init>(SpringJUnit4ClassRunner.java:104)  
  5.     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)  
  6.     at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)  
  7.     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)  
  8.     at java.lang.reflect.Constructor.newInstance(Constructor.java:513)  
  9.     at org.junit.internal.requests.ClassRequest.buildRunner(ClassRequest.java:33)  
  10.     at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:28)  
  11.     at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.<init>(JUnit4TestReference.java:28)  

經檢查是jar包衝突,我在建專案的時候,myeclipse有自動加入junit4,而後面我又自己加入Junit4.8.1。

如果報以下錯誤,則是junit包版本太低,需要4.5或以上的版本

  1. Caused by: java.lang.ClassNotFoundException: org.junit.runners.BlockJUnit4ClassRunner    
  2.     at java.net.URLClassLoader$1.run(URLClassLoader.java:200)    
  3.     at java.security.AccessController.doPrivileged(Native Method)    
  4.     at java.net.URLClassLoader.findClass(URLClassLoader.java:188)    
  5.     at java.lang.ClassLoader.loadClass(ClassLoader.java:307)    
  6.     at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)    
  7.     at java.lang.ClassLoader.loadClass(ClassLoader.java:252)    
  8.     at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)  

其他問題:

@ContextConfiguration({"classpath:applicationContext.xml","classpath:spring/buyer/applicationContext-service.xml"})
匯入配置檔案,這裡我的applicationContext配置檔案是根據模組來分類的。如果有多個模組就引入多個“applicationContext-service.xml”檔案。如果所有的都是寫在“applicationContext。xml”中則這樣匯入: 
@ContextConfiguration(locations = "classpath:applicationContext.xml")
@RunWith(SpringJUnit4ClassRunner.class)SpringJUnit支援,由此引入Spring-Test框架支援! 
@Transactional這個非常關鍵,如果不加入這個註解配置,事務控制就會完全失效! 
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)這裡的事務關聯到配置檔案中的事務控制器(transactionManager = "transactionManager"),同時指定自動回滾(defaultRollback = true)。這樣做操作的資料才不會汙染資料庫! 
AbstractTransactionalDataSourceSpringContextTests要想構建這一系列的無汙染純綠色事務測試框架就必須找到這個基類!(即所有事務均不生效)

  1. import com.wonders.frame.ias.service.IasScheduleTask;  
  2. import org.junit.Test;  
  3. import org.junit.runner.RunWith;  
  4. import org.springframework.stereotype.Component;  
  5. import org.springframework.test.context.ContextConfiguration;  
  6. import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;  
  7. import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;  
  8. import org.springframework.transaction.annotation.Transactional;  
  9. import javax.annotation.Resource;  
  10. /** 
  11.  * Created with IntelliJ IDEA. 
  12.  * User: zhoushun 
  13.  * Date: 2015/3/30 
  14.  * Time: 12:40 
  15.  * To change this template use File | Settings | File Templates. 
  16.  */
  17. @Component
  18. @Transactional
  19. @RunWith(SpringJUnit4ClassRunner.class)  
  20. @ContextConfiguration(locations = "classpath*:applicationContext.xml")  
  21. //public class IasTest extends AbstractTransactionalJUnit4SpringContextTests{
  22. publicclass IasTest extends AbstractJUnit4SpringContextTests {  
  23.     @Resource
  24.     private IasScheduleTask task;  
  25.     @Test
  26.     publicvoid taskTest(){  
  27.         task.urgeTask();  
  28.     }  
  29. }  

相關推薦

Spring整合junit測試

幫我 con 如果 註入 很多 創建 由於 spring配置 pan 本節內容: Spring整合junit測試的意義 Spring整合junit測試 一、Spring與整合junit測試的意義 在沒整合junit之前,我們在寫測試方法時,需要在每個方

Spring整合JUnit

context gconf bean spring tco spring整合 col ext span package cn.itcast.d_junit4; import org.junit.Test; import org.junit.runner.RunWith;

經典三層框架初識(二)---Spring 2.4 spring整合Junit

一.Junit Junit簡介 JUnit是一個Java語言的單元測試框架,用於單元測試. 以前我們測試的時候,一般是單獨建立一個測試類,在裡面寫一個main方法來測試我們的程式,但是實質上這樣用main來做測試是不規範的,因為main方式它是一個應用程式的入

Spring 整合Junit單元測試

1、在pom增加junit和spring-test <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <v

15.Spring-整合Junit測試

QQ群:Java資料共享群 59174518 package vc.helloworld.SpringBean; import javax.annotation.Resource; import org.junit.Test; import org.junit.

Spring整合JUnit框架進行單元測試程式碼使用詳解

一、Spring提供的JUnit框架擴充套件:    1. AbstractSpringContextTests:spring中使用spring上下文測試的Junit擴充套件類,我們一般不會使用這個類來進行單元測試,它是spring內部設計使用到的類    2. Abs

spring 整合 junit

這兩天做Web開發,發現通過Spring進行物件管理之後,做測試變得複雜了。因為所有的Bean都需要在applicationContext.xml中載入好,之後再通過@Resource去取得。如果每次都要整個業務流做的差不多了再去測試,這樣效率很低,也很麻煩。如果單獨去寫

mybatis spring 整合 junit測試無法提交事務

 Junit測試中update語句執行不成功,通過日誌發現事務被回滾了 Releasing transactional SqlSession [[email protected]] ==

Spring系列之新註解配置+Spring整合junit+註解注入

## Spring系列之註解配置 **Spring是輕程式碼而重配置的框架,配置比較繁重,影響開發效率,所以註解開發是一種趨勢,註解代替xml配置檔案可以簡化配置,提高開發效率** **你本來要寫一段很長的程式碼來構造一個Beam物件,但是如果使用註解的話只要使用一個註解符號即可** ![在這裡插入圖

SpringJunit測試整合

color ati ring1 cat with IT 整合 位置 per 一、引入spring測試包:text包 二、@RunWith:指定spring對junit提供的一個運行器   @ContextConfiguration: locations指定spring配置

Spring整合Spring MVC及Mybatis進行Junit單元測試

我們可以在不啟動服務的情況下,進行單元測試,以便提交出高質量的程式碼。本文以一個小例子,說明在Spring中如何進行單元測試。 一:測試Controller 1:在pom.xml檔案中引入相關依賴 <properties> <!-- 設定專案編碼編碼 --&

Spring Test 整合 JUnit 4 使用總結

                這兩天做Web開發,發現通過Spring進行物件管理之後,做測試變得複雜了。因為所有的Bean都需要在applicationContext.xml中載入好,之後再通過@Resource去取得。如果每次都要整個業務流做的差不多了再去測試,這樣效率很低,也很麻煩。如果單獨去寫一個測

Spring Boot學習筆記(六)整合Junit

第一步,在pom.xml檔案中增加依賴 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spr

spring-boot 整合junit測試類 和 spring-boot整合整合testng

一、spring-boot 整合junit測試類 1.引入junit依賴 <!-- springboot junit依賴 --> <dependency> <groupId>org.springframework.boot

整合spring,hibernate4,junit

論壇上有另外一篇更全面的帖子,jinnianshilongnian寫的:http://www.iteye.com/topic/1120924  本文的環境是:  spring-framework-3.1.0  hibernate-4.1.6  junit-4.

JUnitSpring整合——JUnit的TestCase如何自動注入Spring容器託管的物件

問題 在Java中,一般使用JUnit作為單元測試框架,測試的物件一般是Service和DAO,也可能是RemoteService和Controller。所有這些測試物件基本都是Spring託管的,不會直接new出來。而每個TestCase類卻是由JUnit建立的。如何在每

Spring boot整合Junit

一.整合Junit 先建立一個數據庫,並加入點資料來進行操作 DROP TABLE IF EXISTS `s_user`; CREATE TABLE `s_user` ( `id` bigint

Spring+MyBatis+JUnit整合測試的搭建過程總結

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"     xmlns:xsi="http://www.w3.org/2001/XMLSchema

Springjunit測試整合

簡介 Spring提供spring-test-5.2.1.RELEASE.jar 可以整合junit。 優勢:可以簡化測試程式碼(不需要手動建立上下文,即手動建立spring容器) 使用spring和junit整合的步驟 1.匯入jar包 2.建立包com.igeek.test,建立類SpringTest

Spring(三):Spring整合Hibernate

ng- checkout wait 哪些 check driver eas package class 背景:   本文主要介紹使用spring-framework-4.3.8.RELEASE與hibernate-release-5.2.9.Final項目整合搭建