Использование Mockito doAnswer в Котлине

что будет Kotlin эквивалентным этому Java-коду?

doAnswer(new Answer() {
    @Override
    public Object answer(InvocationOnMock invocation) throws Throwable {
        Design design = new Design();
        GetDesign.Listener callback = (GetDesign.Listener) invocation.getArguments()[0];
        callback.onSuccess(design);
        return null;
    }
}).when(someRepository).getDesign(any(GetDesign.Listener.class));

[ОБНОВЛЕНИЕ] Попробовав несколько вариантов, я наконец-то заставил его работать, используя mockito-kotlin. Я думаю, что наиболее удобный способ реализации doAnswer. Синтаксис остается практически неизменным:

doAnswer {
    callback = it.arguments[0] as GetDesign.Listener
    callback.onSuccess(Design())
    null
}.whenever(someRepository).execute(any(GetDesign.Listener::class.java))

Полный код и конфигурацию build.gradle можно найти здесь here

Ответ 1

doAnswer {
    val design = Design()

    val callback = it.arguments[0] as GetDesign.Listener
    callback.onSuccess(design)

    null // or you can type [email protected] null

}.`when`(someRepository).getDesign(any(GetDesign.Listener::class.java))

Ответ 2

Я фанат объекта Full Mocking, я не хочу загружать какую-либо конфигурацию или любые другие инъекции зависимостей при загрузке.

Если мне нужно смоделировать функцию JavaMailSender, я сделаю это следующим образом. Я буду использовать theAnswer, чтобы вернуть значение.

Kotlin (просто протестируйте JavaMailSender)

@Test
fun javaMailSenderTest(){
val jms = mock(JavaMailSender::class.java)
val mimeMessage = mock(MimeMessage::class.java)
mimeMessage.setFrom("[email protected]")
mimeMessage.setText("Just a body text")

Mockito.'when'(jms.send(mimeMessage)).thenAnswer {
  // val callback = it.arguments[0]  <- Use these expression to get params values
  // Since JavaMailSender::send() function retrun void therefore, we should return Unit
  Unit
}

assertEquals(jms.send(mimeMessage), Unit)

}

Kotlin (использование пользовательского класса для JavaMailSender)

Скорее всего, вы можете использовать свой собственный класс Custom для отправки почты, поэтому здесь я сделал это.

@Test
fun updateMembers&SendEmailTest() {

val mockEmailService= mock(MyEmailServiceImplementor::class.java)

// sendInfoMail(true|false) is my custom implemention of JavaMailSender
Mockito.'when'(mockEmailService.sendInfoMail(true)).thenAnswer { invocation ->
  Unit
}

assertEquals(mockEmailService.sendInfoMail(true), Unit)

}

Надеюсь, это кому-нибудь поможет. Если вам нужна версия Java, дайте мне знать в комментариях