Spring Boot 解決方案 - JUnit 測試


簡單的 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 {
    // ...
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM