Java ตรวจสอบวิธีการโมฆะเรียก n ครั้งด้วย Mockito


146

ฉันกำลังพยายามตรวจสอบว่ามีการเรียกเมธอด (โมฆะ) ภายใน DAO - ฉันกำลังใช้จุดคอมมิตที่ส่งรายการผลลัพธ์จนถึงจุดนั้นรีเซ็ตรายการและดำเนินการต่อ สมมติว่าฉันมี 4 สิ่งในรายการและฉันมีจุดคอมมิตเป็น 1 ฉันคาดว่าเมธอด "ส่ง" จะถูกเรียก 4 ครั้ง ฉันตรวจสอบได้ว่าเมธอดถูกเรียกเพียงครั้งเดียวโดยการเขียน

Mockito.verify(mock).send()

มันผ่าน .. แต่ฉันต้องการยืนยันจำนวนครั้งที่ถูกเรียก ฉันจะคิดว่า

Mockito.verify(mock.send(), times(4))

จะเพียงพอ แต่กล่าวว่าพารามิเตอร์ไม่ถูกต้องสำหรับการตรวจสอบ

อนึ่งถ้าฉันเปลี่ยน Mockito.verify(mock).send()ไป Mockito.verify(mock.send())หรือ Mockito.verify((mock).send())ฉันจะได้รับข้อผิดพลาดเดียวกัน ความคิดเกี่ยวกับเรื่องนี้?


10
ลองMockito.verify(mock, times(4)).send(). ฉันสงสัยว่าทำไมคุณถึง "ย้าย" send()การเรียกเมธอดภายในverifyเมธอด คุณมีไวยากรณ์ที่ถูกต้องแล้ว
ทอม


โปรดทราบว่าหากคุณไม่สนใจว่าจะเรียกสิ่งที่เรียกว่ากี่ครั้งคุณสามารถเขียนverify(mock, atLeastOnce()).send();
Dawood ibn Kareem

ขอบคุณที่ถูกต้อง สิ่งที่ฉันพบว่าสับสนคือMockito.verify(mock).send()ผ่านไป แต่เพียงแค่ห่อหุ้มมันทำให้เกิดข้อผิดพลาดซึ่งไม่มีอะไรเปลี่ยนแปลง อย่างไรก็ตามมันชนะ!
nbpeth

คำตอบ:


247

วิธีที่จำเป็นคือMockito # ตรวจสอบ :

public static <T> T verify(T mock,
                           VerificationMode mode)

mockเป็นวัตถุจำลองของคุณและmodeเป็นสิ่งVerificationModeที่อธิบายว่าควรตรวจสอบการจำลองอย่างไร โหมดที่เป็นไปได้คือ :

verify(mock, times(5)).someMethod("was called five times");
verify(mock, never()).someMethod("was never called");
verify(mock, atLeastOnce()).someMethod("was called at least once");
verify(mock, atLeast(2)).someMethod("was called at least twice");
verify(mock, atMost(3)).someMethod("was called at most 3 times");
verify(mock, atLeast(0)).someMethod("was called any number of times"); // useful with captors
verify(mock, only()).someMethod("no other method has been called on the mock");

คุณจะต้องมีการนำเข้าแบบคงที่เหล่านี้จากMockitoคลาสเพื่อใช้verifyวิธีการและโหมดการตรวจสอบเหล่านี้:

import static org.mockito.Mockito.atLeast;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.atMost;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.only;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;

ดังนั้นในกรณีของคุณไวยากรณ์ที่ถูกต้องจะเป็น:

Mockito.verify(mock, times(4)).send()

สิ่งนี้จะตรวจสอบว่ามีการsendเรียกเมธอด4ครั้งบนวัตถุจำลอง มันจะล้มเหลวหากถูกเรียกน้อยกว่าหรือมากกว่า 4 ครั้ง


หากคุณต้องการตรวจสอบว่าเมธอดถูกเรียกเพียงครั้งเดียวคุณไม่จำเป็นต้องผ่านไฟล์VerificationMode. ง่าย

verify(mock).someMethod("was called once");

ก็จะเพียงพอ verify(mock, times(1)).someMethod("was called once");มันใช้ภายใน


เป็นไปได้ที่จะมีการเรียกตรวจสอบหลายครั้งในการจำลองเดียวกันเพื่อให้เกิดการยืนยัน "ระหว่าง" Mockito ไม่สนับสนุนเรื่องแบบนี้verify(mock, between(4,6)).someMethod("was called between 4 and 6 times");แต่เราเขียนได้

verify(mock, atLeast(4)).someMethod("was called at least four times ...");
verify(mock, atMost(6)).someMethod("... and not more than six times");

แทนเพื่อให้ได้พฤติกรรมเดียวกัน ขอบเขตจะรวมอยู่ด้วยดังนั้นกรณีทดสอบจึงเป็นสีเขียวเมื่อมีการเรียกเมธอด 4, 5 หรือ 6 ครั้ง


1
สำหรับคนที่ต้องการที่จะหาที่VerificationModeวิธีคือ (สำหรับการนำเข้าแบบคงที่หรือข้อมูลอ้างอิงที่ชัดเจน) org.mockito.internal.verification.VerificationModeFactoryพวกเขาอยู่ใน
Steve Chambers

verify(mock, atLeast(0)).someMethod("was called any number of times");เป็นประโยชน์ในการเพิกเฉยต่อการยืนยันการโทร
tj-recess

2
มีบางอย่างverify(between(m,n))ที่ตรวจสอบจำนวนการโทรระหว่าง m และ n หรือไม่?
nishant

2
@nishant ไม่ Mockito ดูเหมือนจะไม่สนับสนุนสิ่งนั้น แต่คุณสามารถโทรหาverifyบางครั้งatLeast(M)และatMost(n)รับพฤติกรรมเดียวกันได้ ฉันได้แก้ไขคำตอบอธิบายแล้ว
ทอม

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