2014-11-25 2 views
6

Предположим, у меня есть следующий интерфейс:Можно ли вызвать стандартные реализации интерфейсов с помощью doCallRealMethod Mockito?

public interface ISomething { 

    default int doStuff() { 
     return 2 * getValue(); 
    } 

    int getValue(); 
} 

Когда я теперь высмеивать этот интерфейс, как это:

@Mock 
private ISomething _something; 

@Before 
public void setup() { 
    doCallRealMethod().when(_something).doStuff(); 
} 

и попытаться проверить DoStuff() метод, как следующее:

@Test 
public void testDoStuff() { 
    when(_something.getValue()).thenReturn(42); 
    assertThat("doStuff() returns 84", _something.doStuff(), is(84)); 
} 

Я ожидаю, что тест будет успешным, но я получаю:

org.mockito.exceptions.base.MockitoException: 
Cannot call real method on java interface. Interface does not have any implementation! 
Calling real methods is only possible when mocking concrete classes. 

Я попытался подклассов ISomething с абстрактным классом, как это:

public abstract class Something implements ISomething { 
} 

и издеваться этот класс, как и выше. При таком подходе я получаю то же самое.

Не поддерживает ли Mockito вызовы по умолчанию?

ответ

3

Это правильно. Текущая версия Mockito не поддерживает это. Вы могли бы raise a feature request here. Обратите внимание, что это связано с проблемой 456, которая была исправлена ​​в версии 1.10.0, поэтому сначала проверьте ее в последней версии.