У меня есть оператор 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);
}
Просьба проверить образец пожалуйста. – Opal
@Opal Я добавил образец теста выше. –
Нужно ли нам издеваться над enum? – Ramsharan