簡單的 JUnit 項目
回顧一下創建並運行簡單的 JUnit 測試項目,先添加 JUnit 依賴然后編寫類似如下模板的測試類,使用 IDE 的話直接用插件運行就行, 使用 Maven 的話運行命令 mvn test 就能看到測試結果。
public class Tests {
@Test
public void test() {
// ...
}
}
執行順序
為滿足一些測試對環境的要求,例如數據庫連接及關閉,JUnit 提供了一系列注解來在測試前后進行操作,以下為注解運行的順序的介紹。
@BeforeClass運行測試類前執行且只執行一次@Before每個測試方法執行前執行@Test測試方法,每個測試方法的順序也可以指定@After每個測試方法執行后執行@AfterClass運行測試類后執行且只執行一次
上面提到測試方法也可以指定順序,利用 @FixMethodOrder 標注測試類。
@FixMethodOrder(MethodSorters.DEFAULT)
public class Tests {
// ...
}
MethodSorters 有三種取值,分別
代表不同的執行順序。
DEFAULT由方法名的 hashcode 值大小決定執行順序,若值一樣則根據方法名的字典順序NAME_ASCENDING由方法名的字典順序決定執行順序JVM由 JVM 返回的方法名的順序決定
斷言
JUnit 的 org.junit.Assert 類提供了一系列靜態方法用來斷言,當斷言不成立時會調用 fail 拋出 AssertionError 的異常,也可手動調用 fail 來拋出異常,下面列表為該類提供的靜態方法。
- assertTrue
- assertFalse
- assertNull
- assertNotNull
- assertSame
- assertNotSame
- assertEquals
- assertArrayEquals
- assertThat
- fail
assertEquals 與 assertSame 區別
閱讀源碼可以知道,assertEquals 是調用對象的 equals 方法進行比較,而 assertSame 則是直接用 == 進行比較。
所以用 assertSame 來斷言值類型或者內存地址是否相等,而用 assertEquals 來斷言對象的 equals 方法是否為真。
assertThat 與 Matcher
assertThat 利用 matcher 匹配器來進行斷言,其中一個方法簽名如下所示。
assertThat(T actual, Matcher<T> matcher)
org.hamcrest.CoreMatchers 類中提供了匹配器靜態的方法,可靜態導入里頭所有的方法,如下為用 assertThat 實現 assertTrue 的例子。
import static org.hamcrest.CoreMatchers.*;
public class Tests {
@Test
public void test() {
assertThat(true, is(true)); // same as assertTure()
}
}
另外還可以自定義匹配器,推薦繼承 BaseMatcher<T> 抽象類而不是實現 Matcher<T> 接口,下面為一個簡單的例子。
public class Tests {
private static Contains contains(String substring) {
return new Contains(substring);
}
@Test
public void test() {
assertThat("test", contains("t"));
}
}
class Contains extends BaseMatcher<String> {
private String substring;
public Contains(String substring) {
this.substring = substring;
}
@Override
public boolean matches(Object str) {
return ((String)str).contains(substring);
}
@Override
public void describeTo(Description description) {
// ...
}
}
Spring Boot 使用 JUnit
Spring Boot 中無需任何配置,就能使用 JUnit 來測試,下面是 Spring Boot 項目的自帶的測試模板。
@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoApplicationTests {
@Test
public void contextLoads() {
}
}
指定運行環境及加載配置
測試類標注了兩個注解 ,JUnit 提供的 @RunWith 注解來指定運行環境,這里指定了 SpringRunner 即 Spring 的運行環境。
@SpringBootTest 注解則用來加載所需 Spring 環境所需要的配置,這樣就可以在測試環境中自動裝載所需要的 Bean 。
@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoApplicationTests {
@Autowired
Foo foo;
@Test
public void contextLoads() {
foo.bar();
}
}
加速測試
當有些測試不需要加載整個 Spring Boot 環境時,可以將 @SpringBootTest 改用 @ContextConfiguration 注解只加載所需配置,這樣可以加速測試,下面例子是只需要 DemoConf 類的配置。當完全不需要 Spring 環境來測試時,還可以去掉 @RunWith 注解。
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = DemoConf.class)
public class DemoApplicationTests {
// ...
}
