Mockito Core 和 Mockito Inline 之間的區別
1. 概述
Mockito 是用 Java 創建模擬物件的最受歡迎的框架之一,它提供 Mockito Core 和 Mockito Inline 作為兩個主要的庫,用於具有不同功能和用例的單元測試。
要了解有關使用 Mockito 進行測試的更多信息,請查看我們全面的 Mockito 系列。
2.Mockito核心
Mockito Core 是 Mockito 的基礎函式庫之一。 它提供了創建模擬、存根和間諜的基本功能。該庫足以滿足大多數常見用例,但有一些限制,特別是在處理最終類別和靜態方法時。
請參閱此處 Mockito Core 的模擬範例。
3.Mockito 內聯
Mockito Inline 是 Mockito Core 的擴展,包括模擬最終類別、最終字段、靜態方法和建構函數的附加功能。當您需要模擬或存根這些類型的方法或類別時,該程式庫非常有用。在最新版本的 Mockito Core 中,自Mockito Core 版本 5.0.0起,Mockito Inline 成為預設的類比製作器。
現在,讓我們在我們的程式碼上嘗試一下。首先,我們需要在pom.xml
依賴項中加入mockito-core
:
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>5.11.0</version>
<scope>test</scope>
</dependency>
3.1.模擬期末班
讓我們嘗試模擬我們的最終類,我們需要建立一個名為FinalClass
新類別:
public final class FinalClass {
public String greet() {
return "Hello, World!";
}
}
我們來看看這些模擬final類別的程式碼實作:
@Test
void testFinalClassMock() {
FinalClass finalClass = mock(FinalClass.class);
when(finalClass.greet()).thenReturn("Mocked Greeting");
assertEquals("Mocked Greeting", finalClass.greet());
}
在上面的程式碼範例中,我們模擬了finalClass ,然後對名為greet()
方法進行了存根,以傳回「Mocked Greeting」的字串值,而不是原始值「Hello, World!」。
3.2.模擬最終場
讓我們嘗試模擬我們的 Final 字段,我們需要建立一個名為ClassWithFinalField
的新類別:
public class ClassWithFinalField {
public final String finalField = "Original Value";
public String getFinalField() {
return finalField;
}
}
我們來看看這些模擬final類別的程式碼實作:
@Test
void testFinalFieldMock() {
ClassWithFinalField instance = mock(ClassWithFinalField.class);
when(instance.getFinalField()).thenReturn("Mocked Value");
assertEquals("Mocked Value", instance.getFinalField());
}
在上面的程式碼範例中,我們模擬我們的instance
,然後我們存根方法名稱getFinalField()
以傳回「模擬值」的字串值,而不是原始值「原始值」。
3.3.模擬靜態方法
讓我們嘗試模擬我們的靜態方法,我們需要建立一個名為ClassWithStaticMethod
的新類別:
public class ClassWithStaticMethod {
public static String staticMethod() {
return "Original Static Value";
}
}
我們來看看這些模擬靜態方法的程式碼實作:
@Test
void testStaticMethodMock() {
try (MockedStatic<ClassWithStaticMethod> mocked = mockStatic(ClassWithStaticMethod.class)) {
mocked.when(ClassWithStaticMethod::staticMethod).thenReturn("Mocked Static Value");
assertEquals("Mocked Static Value", ClassWithStaticMethod.staticMethod());
}
}
在上面的程式碼範例中,我們模擬了類別名稱ClassWithStaticMethod
,然後對方法名稱staticMethod()
進行了存根,以傳回「模擬靜態值」的字串值,而不是原始值,即「原始靜態值」。
3.4.模擬構造函數
讓我們嘗試模擬我們的建構函數,我們需要建立一個名為ClassWithConstructor
的新類別:
public class ClassWithConstructor {
private String name;
public ClassWithConstructor(String name) {
this.name = name;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
}
我們來看看這些模擬建構函數的程式碼實作:
@Test
void testConstructorMock() {
try (MockedConstruction<ClassWithConstructor> mocked = mockConstruction(ClassWithConstructor.class,
(mock, context) -> when(mock.getName()).thenReturn("Mocked Name"))) {
ClassWithConstructor myClass = new ClassWithConstructor("test");
assertEquals("Mocked Name", myClass.getName());
}
}
在上面的程式碼範例中,我們模擬了類別名稱ClassWithConstructor
,然後模擬了名為name
的字段,使其具有「Mocked Name」字串值,而不是建構函式中設定的值「test」。
4. 總結
讓我們總結一下到目前為止我們所學到的知識:
要模擬的元素 | 模擬功能 |
---|---|
期末課程 | |
mock ( FinalClass ) |
|
| 最終字段 |
mock
( ClassWithFinalField
.class)
|
| 靜態方法 |
mockStatic
( ClassWithStaticMethod
.class)
|
| 建構函數 |
mockConstruction
( ClassWithConstructor
.class)
|
5. 結論
在本教學中,我們可以比較 Mockito Core 和 Mockito Inline 之間的差異。簡而言之,Mockito Core 可以模擬、存根和監視 Java 程式碼中的常見情況,但不能執行與最終類別、最終方法、靜態方法和建構函式相關的任何操作。另一方面,Mockito Inline 可以做 Mockito Core 做不到的事情,即模擬和存根最終類別、最終字段、靜態方法和建構函數。
程式碼範例可在 GitHub 上取得。