2015-03-13 7 views
4

У меня есть оператор switch для обработки java enum foo, и я использую spock для написания некоторых тестов модульной единицы. Я уже добавил тест, который проверяет, обрабатывается ли каждый тип foo без исключения исключения. Теперь я хочу проверить, что непризнанный тип foo вызовет исключение.Можно ли издеваться над enum со Spock?

Для этого у меня будет издеваться перечисление, и уже видели решение описано здесь: Mocking Java enum to add a value to test fail case

Я также знаю, что можно сделать с powermock, но мне очень нравится Спока, как я находят его невероятно легким и поэтому искали решение, использующее spock.

Я думал, что что-то подобное могло бы сработать:

def "An unexpected type of foo causes an exception to be thrown"() { 
     given: 
     Foo foo = Mock() 
     when: 
     subjectUnderTest.handleFoo foo 
     then: 
     thrown Exception 
} 

Однако это не удается со следующим сообщением об ошибке: org.spockframework.mock.CannotCreateMockException: Cannot create mock for class com.Foo because Java mocks cannot mock final classes. If the code under test is written in Groovy, use a Groovy mock.

я задавался вопросом, если кто-нибудь знал способ сделать это с помощью Спока , так как я не могу найти решение по какой-либо документации.

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

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

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

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

ENUM Foo:

public enum Foo { 
    ONE, TWO; 
} 

Метод обработки Foo:

private void handleFoo(Foo foo) { 
    switch (foo) { 
     case ONE: 
      doEventOne(); 
      break; 
     case TWO: 
      doEventTwo() 
      break; 
     default: 
      throw new IllegalArgumentException("Do not know how to handle " + foo); 
} 
+0

Просьба проверить образец пожалуйста. – Opal

+0

@Opal Я добавил образец теста выше. –

+3

Нужно ли нам издеваться над enum? – Ramsharan

ответ

5

Следующая спецификация будет охватывать добавление нового перечисления без предоставления логики услуг для него :

def 'no exception thrown for all enums'() { 
    given: 
    def service = new SampleService() 

    when: 
    service.handleFoo(se) 

    then: 
    noExceptionThrown() 

    where: 
    se << SampleEnum.values() 
} 

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

Спок не поддерживает насмешливые перечисления.

+0

Спасибо. Я уже получил этот тест. Как я уже сказал, только борется с тестированием блока по умолчанию. –

+0

@BenGreen, обязательно. Как я сказал, он вернется к нему позже. Однако spock не поддерживает насмешливое перечисление. – Opal

+0

@BenGreen, я пытался использовать 'EnumBuster': http://www.javaspecialists.eu/archive/Issue161.html, он отлично работает с java, но имеет некоторые проблемы с groovy. Я не буду исправлять это в разумные сроки, поэтому вы можете считать мой ответ окончательным. – Opal

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