本示例演示瞭如何使用Mockito的spy
>在類中模擬特定方法。 假設我們有一個稱為MyClass
的類:
public class MyClass { public int add(int a, int b) { return a + b + internalMethod(); } private int internalMethod() { return 5; // This is the method we want to isolate } public int anotherMethod() { return 10; } }
>我們要測試add
>方法,但是我們不希望結果受internalMethod
的影響。我們可以使用間諜僅模擬internalMethod
:
import org.junit.jupiter.api.Test; import org.mockito.Mockito; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; public class MyClassTest { @Test void testAddMethod() { MyClass myClassSpy = spy(MyClass.class); when(myClassSpy.internalMethod()).thenReturn(10); // Mock the internal method int result = myClassSpy.add(2, 3); assertEquals(15, result); // 2 + 3 + 10 = 15 } }
MyClass
在此示例中,我們創建了一個when(myClassSpy.internalMethod()).thenReturn(10);
的間諜。 然後,使用internalMethod
,我們將add
存根返回10,將其行為從add
>方法的測試中隔離。然後,主張驗證了internalMethod
方法的行為是否正確,給定模擬的
spy
創建間諜。 然後,您使用Mockito的 spy
Mockito.spy(yourObject)
這將創建一個間諜對象when()
。打電話給
MyClass myClass = new MyClass(); MyClass myClassSpy = spy(myClass); when(myClassSpy.internalMethod()).thenReturn(10); // Mock only internalMethod
來定義要模擬的方法的行為;否則,它將稱為實際實施。 myClassSpy
>internalMethod
在同一類中測試方法時,使用Mockito Spies的潛在陷阱是什麼?
internalMethod
修改對象的狀態,即使您嘲笑了其返回值。 >您通常應該偏愛模擬嘲笑而不是間諜,除非您有一個有力的理由使用Spy。 選擇一個間諜時:
有限的控制:
>您對班級的內部方法的控制有限,例如處理具有復雜依賴關係的最終方法或方法時。 >>但是,即使在這些情況下,也要仔細考慮上面提到的潛在陷阱。 如果可能的話,與依靠間諜一起解決複雜的依賴性或副作用的工作通常是更好的長期解決方案。 通常,結構良好的設計具有明確的關注點,可以使用模擬進行更簡單,更可靠的測試。以上是Mockito間諜:在同一類示例中嘲笑一種方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!