Java Mockito: Cara menyiapkan jawaban yang berbeda

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

Saya ingin menghentikan panggilan yang jika dipanggil pada awalnya akan menimbulkan pengecualian tetapi panggilan berikutnya akan menghasilkan false;

panggilan di atas mengeluh "Variables used in lambda should be final or effectively final"


person ealeon    schedule 19.06.2019    source sumber


Jawaban (2)


Buatlah calledCnt sesuatu yang bisa diubah (misalnya int[] dengan satu elemen, atau AtomicInteger), atau nyatakan jawabannya sebagai kelas anonim, sehingga Anda bisa menambahkan variabel anggota:

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(...);

(Sebenarnya, kelas tersebut tidak harus berupa kelas anonim, bisa berupa kelas apa saja. Cukup mudah untuk menggunakan kelas anonim, karena kelas ini membuat semuanya tetap terlokalisasi di tempat kelas tersebut akan digunakan.)

person Andy Turner    schedule 20.06.2019

Bergantung pada apakah myClass adalah hal yang Anda uji, atau ketergantungan, saya akan merekomendasikan mengejek myClass seluruhnya atau sebagian (yaitu setidaknya panggilan someFunction()). Dengan menggunakan metode then...() Anda dapat menentukan rangkaian item yang akan dikembalikan, misalnya:

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

Panggilan pertama akan memunculkan pengecualian, dan panggilan kedua dan semua panggilan berikutnya akan menghasilkan false.

person MyStackRunnethOver    schedule 20.06.2019