วิธีการตรวจสอบวิธีการเรียกวัตถุที่ไม่ใช่จำลอง?


104

ดูเหมือนว่าม็อกกิโตจะตรวจสอบได้ว่ามีการเรียกใช้วิธีการจำลองวัตถุหรือไม่และวัตถุจำลองมักจะมีบางอย่างเช่นกัน doReturn().when(mock object)

แต่ฉันสามารถสร้างวัตถุจำลองและกำหนดdoReturn().when(mock object) แล้วตรวจสอบว่าวิธีการของวัตถุอื่นเรียกว่า?

นี่คือสิ่งที่ฉันต้องการทำ: ฉันกำหนด mockEnvironment และตอบกลับไม่ว่าจะเกิดอะไรขึ้น แต่ฉันต้องการตรวจสอบวิธีการต่างๆของ anotherObj ถูกเรียกในกรณีที่แตกต่างกัน

ต้องทำอย่างไร?

public class BaseClass {
    private Environment mockEnvironment;
    @Test
    public void testcase () {
     setMockitoEnvironment(); 
     response = foo(mockEnvironment, argument1);
     verify(anotherObj).codePath1(...);
     response = foo(mockEnvironment, argument2);
     verify(anotherObj).codePath2(...);
   }
}

//this method successfully return a response with any input 
//because I do not care how response is eventually generated, 
//I only care whether code path reaches createResponse() via 
//code path 1 or code path 2.
private void setMockitoEnvironment() {
    mockEnvironment = mock(Environment.class);
    doReturn (response).when(mockEnvironment).createResponse(for any input);
}
private Response foo(...) {
    ... 
    return createResponse(...);
}

คำตอบ:


123

คุณสามารถใช้ Mockito Spyสำหรับสิ่งนี้ หากคุณตั้งค่าanotherObjเป็นสายลับคุณสามารถตรวจสอบการเรียกใช้เมธอดบนวัตถุนั้นได้ ในตัวอย่างของคุณคุณต้องให้แน่ใจว่าการเรียกร้องให้ใช้สายลับแทนการดำเนินงานปกติของfoo anotherObjสายลับถูกตั้งค่าดังนี้:

AnotherClass anotherObjSpy = Mockito.spy(new AnotherClass());
// do stuff -- e.g. anotherObjSpy.foo(...);
verify(anotherObjSpy).codePath1(...);

นั่นหมายความว่าฉันอาจต้องสร้างและฉีดวัตถุจำลองหลายชิ้นถ้าฉันต้องการตรวจสอบหลาย ๆ สิ่ง? ที่ไม่สะดวก
user389955

@ user389955 ใช่คุณต้องตั้งค่าแต่ละวัตถุที่คุณต้องการตรวจสอบว่าเป็นสายลับ เท่าที่ฉันรู้ไม่มีทางรอบนั้น Mockito จำเป็นต้องเพิ่มพร็อกซีให้กับวัตถุและต้องมีคนบอก Mockito ว่าวัตถุใดที่จะใช้พร็อกซี
K Erlandsson

10
แทนที่จะพูดว่า "// do stuff" อาจเป็นประโยชน์หากเพิ่มว่าเป็น "anotherObjSpy" ที่ต้องทำให้เมธอดถูกทดสอบ
jwehrle

ขอบคุณ @jwehrle คุณต้องใช้ anotherObjSpy ในการโทรมิฉะนั้นการทดสอบจะไม่ทำงาน
อาโก

2

ใส่คำอธิบายประกอบวัตถุที่ไม่ใช่จำลองที่มีคำอธิบายประกอบและจากนั้นตรวจสอบ@Spy verify()ตรวจสอบสิ่งนี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.