一、什麼是單元測試
單元測試(unit testing),是指對軟體中的最小可測試單元進行檢查和驗證。對於單元測試中單元的含義,一般來說,要根據實際情況去判定其具體含義,如C語言中單元指一個函式,Java裡單元指一個類,圖形化的軟體中可以指一個視窗或一個選單等。總的來說,單元就是人為規定的最小的被測功能模組。單元測試是在軟體開發過程中要進行的最低階別的測試活動,軟體的獨立單元將在與程式的其他部分相隔離的情況下進行測試。(來自百度百科)
回想一下前面的例子,每次進行測試的時候都用了一個主函式,在主函式的裡呼叫要測試的類,而單元測試的話就不需要寫主函式了。
二、Spring單元測試怎麼搞?
(下面的例子基於上一個例子)
- 準備工作
- 要準備的包
spring-test
junit
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>SpringLearn</groupId>
<artifactId>SpringDemo</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.3.11.RELEASE</version>
</dependency>
<dependency>
<groupId>aopalliance</groupId>
<artifactId>aopalliance</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.3.11.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.11.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.11.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjrt -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.9.1</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.6.8</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<!--單元測試的包-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.3.11.RELEASE</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-eclipse-plugin</artifactId>
<version>2.8</version>
<configuration>
<downloadSources>true</downloadSources>
</configuration>
</plugin>
</plugins>
</build>
</project>
複製程式碼
- 修改Test類為:
package com.learn.test;
import com.learn.service.ProductService;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class Test {
@Autowired
ProductService ps;
@org.junit.Test
public void test() {
ps.doSomeService();
}
}
複製程式碼
這裡要解釋一下test()方法前面註解是,是因為Test註解 和 Test類重名了,所以一定要加上包名。
修改完成後main函式被去掉了而加上了和單元測試有關的註解。
@RunWith(SpringJUnit4ClassRunner.class) 放在類名前,用來指明這是一個Spring的測試類。
@ContextConfiguration("classpath:applicationContext.xml") 放在類名前,找到Spring的配置檔案。
@Test 放在要測試的方法前,測試邏輯。
執行的時候要用JUnit的方式執行,如下圖所示:
執行結果:
start log:doSomeService
假裝這裡是一些核心業務程式碼!
end log:doSomeService
複製程式碼
- 換個類試試
先修改一下ProductSer類為:
package com.learn.service;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.stereotype.Component;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
@Component("ps")
public class ProductService {
@Test
public void doSomeService() {
System.out.println("假裝這裡是一些核心業務程式碼!");
}
}
複製程式碼
執行結果:
假裝這裡是一些核心業務程式碼!
複製程式碼
可以看到單元測試完全是獨立的,前面配置好的AOP,一點作用都沒起。