1.1 Mockito 庫
今天我們將熟悉高級測試。更具體地說,使用Mockito庫。甚至不要考慮離開這個行業。
首先,這個庫是Spring測試中的一個標準。這實際上是 Java 後端開發行業的標準。
其次,您必須為 Spring 代碼編寫測試。了解您編寫的後端是否正常工作的唯一方法是調用其 API 的方法。進行測試比不進行測試要容易 10 倍。你會親眼看到的。
您可以使用以下代碼將 Mockito 庫添加到您的庫中pom.xml
:
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-junit-jupiter</artifactId>
<version>4.2.0</version>
<scope>test</scope>
</dependency>
1.2 模擬對象
那麼這個 Mockito 是什麼,為什麼這麼好?
在開發和開發測試的過程中,經常需要將某種“存根”而不是真實對象插入代碼中。
例如,與數據庫一起工作的代碼經過測試並在那裡進行了一些更改。最好在每次測試之前該數據庫的狀態相同(否則測試將不同)。我希望基礎更簡單,以便快速回滾這些狀態。
或者,例如,您正在測試發送有用 SMS 的代碼。對於直郵,他使用某種付費短信網關。最好將一些虛擬網關放入其中以測試代碼,以免向無法理解的人發送數百條 SMS。
或者您的代碼正在從其他 Web 服務器請求數據,而這些數據在測試服務器上根本不可用。或者你寫一個在線支付的代碼,需要測試50次,然後才允許在真正的金融渠道中使用。
我想你明白了……虛擬對象,或者它們也被稱為存根對象,是一個非常有用的東西。
困難來了——Java 有靜態類型。這意味著為了將對ReadDatabase
對象的引用分配給變量而不是 類型的對象,您需要從VirtualDatabase
繼承類。VirtualDatabase
RealDatabase
然後發現這個類有RealDatabase
一堆私有的方法和變量存儲了對其他真實對象的引用,你不能這樣寫一個普通的存根。理論上是好的,但實際上是死胡同。
Java 5 中出現了救援(您可以閱讀DynamicProxy
更多詳細信息)。它允許您創建編譯器沒有任何抱怨的虛擬對象。
此類虛擬對象稱為模擬(來自模擬一詞 - 佈局)。Mockito 庫能夠將這些模擬的工作提升到前所未有的高度。因此,順便說一句,圖書館的名字。
1.3 @ExtendWith註解
Mockito 庫與 JUnit 配合得很好,它甚至可以被認為是它的擴展。
有兩種方法可以在單元測試中啟用 Mockito 庫。第一種方式是添加一個特殊的註解:
@ExtendWith(MockitoExtension.class)
public class MockitoAnnotationTest {
...
}
第二種方法是通過調用方法啟用它的工作openMocks()
:
public class MockitoAnnotationTest {
@BeforeEach
public void init() {
MockitoAnnotations.openMocks(this);
}
}
大多數情況下,您會看到第一個選項,但有時知道還有第二個選項會很有用。
GO TO FULL VERSION