2015-12-17 2 views
1

У меня проблема с пониманием семантики за следующим фрагментом кода.Понимание семантики за проверкой Mockito

@Test 
public void TestAbc() throws AbcException { 
    // method to test 
    object.handle(); 

    // assertions 
    verify(someThing).someMethod(); 
    verify(problemObject).problemMethod(); 
} 

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

public void handle() { 
    try { 
     someThing.someMethod(); 
     // throws AbcException 
     problemObject.problemMethod(); 
    } 
    catch (AbcException e) { 
     LOGGER.error(e.getMessage()); 
    } 
} 

Сейчас в моем тесте я делаю throws AbcException, чтобы держать вещи синтаксически правильно, но это не имеет смысла, так как я ловя исключение в методе дескриптора и не бросает его дальше. Но метод теста переводится как «TestAbc throws AbcException», что на самом деле не так. Поэтому моя проблема заключается в том, почему мне нужно добавить throws AbcException в свой тестовый метод, даже его не выбрасывать? Может ли кто-нибудь помочь мне понять это?

ответ

1

Вы вынуждены добавить AbcException в подпись вашего теста, потому что в своем утверждении вы вызываете problemMethod, который имеет в своей подписи throws AbcException. (Я полагаю, что AbcException является проверенным исключением).

Поэтому вы должны либо уловить, либо сбросить это исключение. verify вернет объект типа того, с которым вы его кормите, поэтому для java-компилятора вы просто вызываете метод, который может выставить проверенное исключение, и поэтому вы вынуждены его обрабатывать.

3

verify(problemObject) возвращает экземпляр класса Mockito, который используется для указания того, что вы хотите проверить. Чтобы обеспечить свободный синтаксис, где вы можете просто вызвать problemMethod() на этом объекте, класс реализует интерфейс (или расширяет класс), который problemObject насмехается. Несмотря на то, что problemMethod() в этом классе просто проверяет, был ли вызван problemMethod() на mock, компилятор Java не знает этого и видит только, что вы вызываете метод, подпись которого говорит throws AbcException, поэтому вам нужно его обработать.

PS: Если у вас есть другой код настройки, ваши издевался problemMethod не будет на самом деле бросить что-нибудь - вам нужно явно установить макет для этого:

when(problemObject.problemMethod()).thenThrow(new AbcException()); 
+0

полностью имеет смысл, но интерпретация моих тестов - это метод обработки вызова и проверка того, что проблема называется метод. Я вижу, что это необходимо для поддержания синтаксически правильной работы, но логически это не имеет большого смысла, поскольку мой метод тестирования (и не может) бросать AbcException. –

+2

Ну, это логично в логической структуре правил синтаксиса языка программирования. Из-за творческих приемов Mockito вы находитесь в ситуации, когда у вас есть больше информации, чем то, что вы можете выразить с помощью правил синтаксиса («этот вызов метода на самом деле не вызывает это исключение»), поэтому синтаксический анализ не может сделать правильный умозаключение. –

3

throws не означает, что метод бросает исключение. Это значит, что метод может сделать исключение.. Поскольку TestAbc() вызывает problemMethod(), и этот метод может выдать проверенный AbcException, и вы не поймаете его в методе тестирования, вы должны объявить его, чтобы сделать компилятор счастливым.

Исключение во время выполнения никогда не будет выбрано, поскольку Mockito не будет выбрасывать это исключение. Но компилятор этого не знает.

+0

TestAbc не вызывает problemMethod, его просто проверяет, что его вызвал. Но с точки зрения синтаксиса это имеет смысл. –

+0

Он называет это: 'verify (problemObject) .problemMethod();'. –

+0

разве это не утверждение?вместо фактического вызова (опять семантически)! –

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