Junit5系列-Junit5中Assumptions假設類
系列導航
簡介
在Junit5中的JUnit Jupiter模組附帶了JUnit 4提供的假設方法的一個子集,並新增了一些非常適合與Java 8 lambdas一起使用的方法。 所有JUnit Jupiter假設測試方法都是org.junit.jupiter.api.Assumptions
類中的靜態方法。
Assumptions類顧名思義是假設的意思也就是做一些假設,只有當假設成功後才會執行接下來的程式碼。說的再詳細不如實踐,下面看一下案例。
使用Assumptions類中的假設方法時,當假設不成立時會報錯,但是測試會顯示被ignore忽略執行。也就是當我們一個類中有多個測試方法時,其中一個假設測試方法假設失敗,其他的測試方法全部成功,那麼該測試類也會顯示測試成功!
這說明假設方法適用於:在不影響測試是否成功的結果的情況下根據不同情況執行相關程式碼!
可以看下面一個案例:
案例解析
其中每個方法的作用程式碼中的註釋寫的已經非常清楚了
,就不再贅述了.
大家最好將程式碼自己測試一遍,可以加深理解與記憶!
案例程式碼:
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assumptions.assumeFalse;
import static org.junit.jupiter.api.Assumptions.assumeTrue;
import static org.junit.jupiter.api.Assumptions.assumingThat;
import org.junit.jupiter.api.Test;
/**
* @author liyangyang
* @date 2019/1/8
*/
class AssumptionsDemo {
@Test
void testAssumTrue() {
System.out.println("test");
//assumeTrue該語句並不會影響其前面的語句執行
//可以將3>5改成3<5自行測試成功的效果
assumeTrue(3>5);
//該方法中下面所有的程式碼變為在上面假設的條件成立後執行
// 如果上述假設不成立,則會忽略執行該行下面的程式碼,並報錯
System.out.println("assume is true!");
}
@Test
void testAssumTrueMessage() {
assumeTrue(3<5,
//第二個引數為當第一個引數不成立時,輸出的自定義錯誤資訊
() -> "Aborting test: not on developer workstation");
//下面的程式碼變為在上面假設的條件成立後執行
System.out.println("assume is true!");
}
@Test
void testAssumeTrueLambda(){
//這個方法的第一個引數為函式式介面,通過看起原始碼可以發現無引數,返回值為boolean
assumeTrue(()->{
System.out.println("in assumeTrue");
// boolean flag = true;
boolean flag = false;
return flag;
});
System.out.println("out assumeTrue");
}
@Test
void testAssumFalse(){
//同assumTrue效果相反
assumeFalse(3>5);
System.out.println("assume is true!");
}
@Test
void testAssumFalseMessage(){
//同assumTrue效果相反
assumeFalse(3<5,
() -> "Aborting test: not on developer workstation");
System.out.println("assume is true!");
}
@Test
void testAssumThat() {
assumingThat(3>5,
() -> {
//與上述方法不同的是,僅當前面假設成立時,才會執行這裡面的語句!!!!
// 且只會影響到該lambda表示式中的程式碼
assertEquals(2, 2);
});
//此處的斷言不受上述assumingThat限制,在所有情況下都會執行
System.out.println("no effect");
assertEquals("a string", "a string");
}
}
通過上述的案例,相信大家已經瞭解了Assumptions類的使用方法,下面我們來分析一下這個類。
原始碼分析
首先,我們看一下Assumptions類都有什麼方法。
從圖片中可以看到主要有5種方法:
- 構造方法
- 靜態共有assumeFalse系列過載方法
- 靜態共有assumeTrue系列過載方法
- 靜態共有assumeThat系列過載方法
- 靜態私有throwTestAbortedException方法
其中的過載方法以assumeFalse為例說一下:
- assumeFalse(boolean assumption) : 一個boolean型別引數假設表示式。
- assumeFalse(BooleanSupplier assumptionSupplier) : 函式式介面引數BooleanSupplier無參一個boolean返回值,使用lambda表示式即可,上述案列中也有涉及此類方法的使用
- assumeFalse(boolean assumption, String message) : 第一個引數假設表示式,第二個引數假設失敗時自定義輸出
- assumeFalse(boolean assumption, Supplier
messageSupplier) : 效果和assumeFalse(boolean assumption, String message)類似,只是將第二個自定義輸出改成了函式式介面,可以使用lambda表示式,更加靈活。
ps:如果不知道什麼是函式式介面或者lambda表示式,可以參考此博文:https://segmentfault.com/blog/yinhaonefu_java8
其中的作用在上述的案例分析中已經說明的很清楚了,接下來我們看一下其中的兩個代表方法assumeTrue和assumeThat的原始碼是怎樣的。
1.assumeTrue(boolean assumption, String message)原始碼:
public static void assumeTrue(boolean assumption, String message) throws TestAbortedException {
if (!assumption) {
//呼叫方法
throwTestAbortedException(message);
}
}
//被呼叫方法
private static void throwTestAbortedException(String message) {
throw new TestAbortedException(StringUtils.isNotBlank(message) ? "Assumption failed: " + message : "Assumption failed");
}
從上述可以看到其程式碼過程為:
- 判斷引數assumption是否為true,為true則成功執行
- 如果不為true,則呼叫throwTestAbortedException方法丟擲一個自定義異常TestAbortedException
2.assumingThat(boolean assumption, Executable executable)方法原始碼分析:
public static void assumingThat(boolean assumption, Executable executable) {
if (assumption) {
try {
executable.execute();
} catch (Throwable var3) {
ExceptionUtils.throwAsUncheckedException(var3);
}
}
}
從原始碼中就可以看出,只有當引數assumption為true時才會執行(executable.execute())第二個引數lambda表示式中的內容, 看一下第二個引數Executable的原始碼:
@FunctionalInterface
@API(
status = Status.STABLE,
since = "5.0"
)
public interface Executable {
void execute() throws Throwable;
}
可以看到這裡的Executable還是一個函式式介面(@FunctionalInterface),無參無返回值。只有一個execute()。
好了,到這裡大家應該對Assumptions假設類有個全面的瞭解了,如果還是有疑問,可以自行根據原始碼並對照本部落格進行理解。
如果轉載此博文,請附上本文連結,謝謝合作~:https://blog.csdn.net/csdn___lyy
如果感覺這篇文章對您有所幫助,請點選一下“喜歡”或者“關注”博主,您的喜歡和關注將是我前進的最大動力!
refer: 官網
相關文章
- JUnit5學習之二:Assumptions類
- Junit5系列-Junit5中Assertions斷言類
- Junit5系列-Junit5中@Disabled禁止執行
- Junit5系列-Junit5中@DisplayName自定義名稱
- Junit5系列-什麼是Junit5?
- Junit5系列-Junit5中assertThrows()與assertDoesNotThrow()方法詳解
- Junit5系列-Junit5中DisabledCondition條件測試執行
- JUnit5學習之三:Assertions類
- JUnit5註解學習指引
- JUnit5編寫基本測試
- junit5 是不是全方面吊打 testng
- JUnit5的Tag、Filter、Order、LifecycleFilter
- JUnit5學習之一:基本操作
- JUnit5依賴注入與測試介面依賴注入
- 基於 junit5 實現 junitperf 原始碼分析原始碼
- JUnit5學習之四:按條件執行
- JUnit5學習之八:綜合進階(終篇)
- Java新一代單元測試框架JUnit5速覽Java框架
- JUnit5學習之五:標籤(Tag)和自定義註解
- Springboot整合JUnit5優雅進行單元測試Spring Boot
- Spring 對 Junit4,Junit5 的支援上的運用Spring
- JUnit5的條件測試、巢狀測試、重複測試巢狀
- JUnit5學習之六:引數化測試(Parameterized Tests)基礎Zed
- JUnit5學習之七:引數化測試(Parameterized Tests)進階Zed
- IT職場:假設檢驗中如何確認是否應該拒絕原假設?
- “假設”家族大起底!如何正確區分科學假設、統計假設和機器學習假設?機器學習
- 機器學習之分類:真與假以及正類別與負類別機器學習
- dart系列之:dart類中的泛型Dart泛型
- 理解假設檢驗與P值
- DMAIC:大膽假設,小心求證!AI
- Java面試系列第2篇-Object類中的方法Java面試Object
- dart系列之:dart類中的建構函式Dart函式
- 第八章 假設檢驗
- Oracle EBS總賬與會計假設Oracle
- 機器學習系列之分類機器學習
- [Java併發系列] 2.Java中的原子操作類Java
- 設計模式中類的關係設計模式
- 統計學之假設檢驗的原理