Как смоделировать интерфейс по умолчанию метод Java8 / Mockito2 - PullRequest
0 голосов
/ 23 ноября 2018

Я не могу смоделировать метод, определенный как интерфейс по умолчанию.Может кто-нибудь помочь мне здесь?

В интерфейсе есть метод по умолчанию, обеспечивающий регистратор.

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public interface Loggable {

  default Logger logger() {
    return LoggerFactory.getLogger(this.getClass());
  }
}

Используется следующим образом:

public class AppShowOff implements Loggable{

  public void doMagic() {
    logger().debug("It works");
    System.out.println("Works");
  }
}

Теперь я хотел бынаписать тест, подтверждающий, что метод отладки был вызван.

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import org.junit.Test;
import org.mockito.Mockito;
import org.slf4j.Logger;

public class AppShowOffTest {

  @Test
  public void doMagic() {
    Logger loggerMock = mock(Logger.class);
    Loggable loggableMock = mock(Loggable.class); // <- not needed, but I also tried this way

    // mocks done

    AppShowOff app = new AppShowOff();
    AppShowOff appSpy = Mockito.spy(new AppShowOff());

    when(loggableMock.logger()).thenReturn(loggerMock);
    when(appSpy.logger()).thenReturn(loggerMock);

    app.doMagic();
    verify(loggerMock, times(1)).debug(any());
  }
}

, как вы можете видеть, я пытался смоделировать метод по умолчанию двумя способами:

when(loggableMock.logger()).thenReturn(loggerMock);
when(appSpy.logger()).thenReturn(loggerMock);

, но он не работает,Результат:

Требуется, но не вызывается: logger.debug ();-> at so.AppShowOffTest.doMagic (AppShowOffTest.java:29) На самом деле с этим макетом не было никаких взаимодействий.

1 Ответ

0 голосов
/ 23 ноября 2018

Здесь:

AppShowOff app = new AppShowOff();
AppShowOff appSpy = Mockito.spy(new AppShowOff());

Это первое app ... никогда не используется, кроме как для вызова тестируемого метода doMagic().

Простой ответ: drop app полностью, и вызвать appSpy.doMagic().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...