2013-07-06 3 views
2

У меня есть ниже интерфейсуПроблемы пытаются бросить проверяемое исключение с Mockito

public interface Interface1 { 
    Object Execute(String commandToExecute) throws Exception; 
} 

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

Interface1 interfaceMocked = mock(Interface1.class); 
when(interfaceMocked.Execute(anyString())).thenThrow(new Exception()); 
Interface2 objectToTest = new ClassOfInterface2(interfaceMocked); 
retrievePrintersMetaData.Retrieve(); 

Но компилятор говорит мне, что существует необработанное исключение. Определение метода подмотки:

public List<SomeClass> Retrieve() { 
    try { 
     interface1Object.Execute(""); 
    } 
    catch (Exception exception) { 
     return new ArrayList<SomeClass>(); 
    } 
} 

документация Mockito только показывает использование RuntimeException, и я ничего о похожих на StackOverflow не видел. Я использую Java 1.7u25 и mockito 1.9.5

ответ

2

Предполагая, что ваш метод тестирования не объявляет, что он выбрасывает Exception, абсолютно прав компилятора. Эта линия:

when(interfaceMocked.Execute(anyString())).thenThrow(new Exception()); 

... называет Execute на примере Interface1. Это может вызвать Exception, так что вам нужно либо поймать его, либо объявить, что ваш метод его выбрасывает.

Я лично рекомендовал бы просто объявить, что метод испытания выбрасывает Exception. Ничто другое не будет заботиться об этом объявлении, и вы действительно не хотите его поймать.

+0

Решает проблему. Я ожидал, что Мокито позаботится об этом. Еще не используется для сведений об проверенных исключениях. –

0

У вас не должно возникнуть проблемы, если ваш метод вернет что-то и выбросит вашу ошибку. Теперь, если ваш метод возвращает void, вы не сможете выбросить ошибку.

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

public List<SomeClass> Retrieve() { 
    try { 
     interface1Object.Execute(""); 
    } 
    catch (Exception exception) { 
     return handleException(exception); 
    } 
} 

protected List<SomeClass> handleException(Exception exception) { 
    return new ArrayList<SomeClass>(); 
} 

Затем вы просто вызываете метод handleException и удостоверяетесь, что он возвращает правильную вещь. Если вам нужно убедиться, что ваш интерфейс выбрасывает исключение, то это другой тест для вашего класса интерфейса.

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

Смежные вопросы