Java Mockito: วิธีเตรียมคำตอบต่างๆ

int calledCnt = 0;
doAnswer(i -> {
    if (calledCnt == 0) {
        calledCnt += 1;
        throw new InternalServerErrorException("test");
    }
    return false;
}).when(myClass.someFunction(any()));

ฉันต้องการตัดการโทรโดยที่หากถูกเรียกในตอนแรกจะมีข้อยกเว้น แต่การโทรครั้งต่อไปจะคืนค่าเท็จ

โทรข้างต้นบ่น "Variables used in lambda should be final or effectively final"


person ealeon    schedule 19.06.2019    source แหล่งที่มา


คำตอบ (2)


ทำให้ calledCnt บางอย่างไม่แน่นอน (เช่น int[] ที่มีองค์ประกอบเดียว หรือ AtomicInteger) หรือประกาศคำตอบเป็นคลาสที่ไม่ระบุชื่อ เพื่อให้คุณสามารถเพิ่มตัวแปรสมาชิกได้:

doAnswer(new Answer<Boolean>() {
  int calledCnt = 0;

  @Object public Boolean answer(InvocationOnMock invocation) {
    if (calledCnt == 0) {
      calledCnt += 1;
      throw new InternalServerErrorException("test");
    }
    return false;
  }
}).when(...);

(จริงๆ แล้ว ไม่จำเป็นต้องเป็นคลาสที่ไม่เปิดเผยตัวตน แต่อาจเป็นคลาสประเภทใดก็ได้ การใช้คลาสที่ไม่ระบุตัวตนนั้นสะดวกกว่า เพราะมันเก็บทุกอย่างไว้ที่ตำแหน่งที่จะใช้)

person Andy Turner    schedule 20.06.2019

ขึ้นอยู่กับว่า myClass เป็นสิ่งที่คุณกำลังทดสอบหรือเป็นการพึ่งพา ฉันขอแนะนำให้ล้อเลียน myClass ทั้งหมดหรือบางส่วน (เช่น อย่างน้อยการเรียก someFunction()) การใช้เมธอด then...() คุณสามารถระบุ ชุด ของรายการที่จะส่งกลับ เช่น:

when(myMockedClass.someFunction(any()))
    .thenThrow(new InternalServerErrorException("test"))
    .thenReturn(false);

การเรียก ครั้งแรก จะส่งข้อยกเว้น และการเรียกครั้งที่สอง และการเรียกที่ตามมาทั้งหมด จะส่งคืนค่าเท็จ

person MyStackRunnethOver    schedule 20.06.2019