Mockito UnfinishedStubbingException при насмешке несколько раз - PullRequest
0 голосов
/ 27 февраля 2020

Я хочу присвоить методу generateReferenceNumber () в моем классе Invoice:

public class Invoice {

    private String id;
    private String referenceNumber;
    private Date issueDate;
    private PaymentMethod paymentMethod;
    private Date paymentDate;
    private String shopId;
    private List<InvoiceGroupItem> groupItems;
    private InvoiceStatus status;

    public void moveToNextState() {
        status = status.nextState();
    }

    public void generateReferenceNumber() {
        if (referenceNumber != null) {
            return;
        }

        referenceNumber = new InvoiceReference().createNew(issueDate).toString();
    }
}

Этот объект используется в сервисе, который я хочу протестировать. Для этого мне нужно несколько счетов. Итак, я написал следующий код:

private Stream<Invoice> buildApprovedInvoice() {
    val approvedInvoices = new ArrayList<Invoice>();

    for (int i = 0; i < 10; i++) {
        val invoice = Invoice.builder().build();
        val spy = spy(invoice);

        doAnswer(invocation -> {
            final Invoice mock = (Invoice) invocation.getMock();
            mock.setReferenceNumber("Invoice reference number");
            return null;
        }).when(spy).generateReferenceNumber();

        approvedInvoices.add(spy);
    }

    return approvedInvoices.stream();
}

И когда я выполняю тест, я получаю следующую ошибку:

org.mockito.exceptions.misusing.UnfinishedStubbingException: Незавершенная заглушка обнаружено здесь: -> в com.coruscant.core.services.invoice.InvoiceSendingServiceTest.sendInvoices (InvoiceSendingServiceTest. java: 54)

Например, thenReturn () может отсутствовать. Примеры правильной заглушки: when (mock.isOk ()). ThenReturn (true); когда (mock.isOk ()) thenThrow (исключение). doThrow (исключение) .when (mock) .someVoidMethod ();

У кого-нибудь есть идея, почему?

Спасибо.

1 Ответ

1 голос
/ 28 февраля 2020

Вам не нужно издеваться Invoice для тестирования. Или вы можете издеваться InvoiceReference, если это юнит тест. Если это интеграционный тест:

class Test {

   private Invoice invoice;

   @BeforeEach
   void setUp() {
      invoice - new Invoice();
   }
   @Test
   void shouldSetReferenceNumber_WhenReferenceNumberEqualsNull() {
      invoice.setIssueDate(new Date());
      invoice.generateReferenceNumber();
      assertThat(invoice).hasFieldWithValue("referenceNumber", expectingValue);
   }

   @Test
   void shouldNotSetReferenceNumber_WhenReferenceNumberIsNotEqualsNull() {
      invoice.setReferenceNumber("test-reference-number");
      invoice.generateReferenceNumber();
      assertThat(invoice).hasFieldWithValue("referenceNumber", "test-reference-number");
   }
}

Модульный тест (фиктивная InvoiceReference):

public class Invoice {

    private String id;
    private String referenceNumber;
    private Date issueDate;
    private PaymentMethod paymentMethod;
    private Date paymentDate;
    private String shopId;
    private List<InvoiceGroupItem> groupItems;
    private InvoiceStatus status;

    public void moveToNextState() {
        status = status.nextState();
    }

    public void generateReferenceNumber() {
        if (referenceNumber != null) {
            return;
        }

        getInvoiceReference().createNew(issueDate).toString(); 
    }

   public InvoiceReference getInvoiceReference() {
      return new InvoiceReference();
   }
}

class Test {

   private Invoice invoice;
   @Mock
   private InvoiceReference invoiceReference;

   @BeforeEach
   void setUp() {
      invoice = new Invoice();
      MockitoAnnotations.initMocks(this);
      when(invoiceReference.createNew(any(Date.class)).thenReturn("test-reference-number");
   }

   @Test
   void shouldSetReferenceNumber_WhenReferenceNumberEqualsNull() {
      invoice.setIssueDate(new Date());
      invoice.generateReferenceNumber();
      assertThat(invoice).hasFieldWithValue("referenceNumber", "test-reference-number");
   }

   @Test
   void shouldNotSetReferenceNumber_WhenReferenceNumberIsNotEqualsNull() {
      invoice.setReferenceNumber("different_reference_number");
      invoice.generateReferenceNumber();
      assertThat(invoice).hasFieldWithValue("referenceNumber", "different_reference_number");
   }
}
...