2

Я работаю с:Отчеты Spock & Spock: как «поймать» и настроить сообщение об ошибке для AssertionError?

  • Спок Ядро
  • Спок Отчеты
  • Спок Spring
  • Spring MVC Тестирование

и у меня есть следующий код:

@FailsWith(java.lang.AssertionError.class) 
def "findAll() Not Expected"(){ 

    given: 

     url = PersonaUrlHelper.FINDALL; 

    when: 

     resultActions = mockMvc.perform(get(url)).andDo(print()) 

    then: 

     resultActions.andExpect(status().isOk()) 
        .andExpect(content().contentType(MediaType.APPLICATION_XML)) 


} 

код не удается (как ожидается), потому что проверенный метод действительно возвращает(MediaType.APPLICATION_JSON) вместо (MediaType.APPLICATION_XML).

Так, что причина @FailsWith(java.lang.AssertionError.class).

Даже если я использую @FailsWith(value=java.lang.AssertionError.class, reason="JSON returned ...") я не в состоянии видеть reason через Спок Reports

Вопрос Один: как я могу видеть reason на Спок Reports?.

Я знаю, что Спок предлагает метод выброшен(), поэтому я могу сделать:

then: 
     def e = thrown(IllegalArgumentException) 
     e.message == "Some expected error message" 
     println e.message 

К сожалению выброшен не работает AssertionError.

Если я использую thrown(AssertionError) метод тест не проходит, уникальный путь через @FailsWith, но я не в состоянии получить сообщение об ошибке из AssertionError

Вопрос Два как можно получить сообщение Ошибка от AssertionError?

Я знаю, что я могу сделать что-то вроде

then: "Something to show on Spock Reports" 

Но просто интересно, если вопрос два могут быть решены ..

ответ

1

относительно Вопрос один:

если посмотреть на FailsWithExtension#visitFeatureAnnotation вы можете видеть, что оценивается только значение от @FailsWith, reason не касается вообще. Что бы вы могли сделать, это ввести свой собственный аннотация (настраиваемый, например, @FailsWith) и переопределить AbstractAnnotationDrivenExtension#visitFeatureAnnotation. Там у вас есть доступ к параметру reason.

относительно Вопроса два:

пожалуйста смотрите по этой ссылке: http://spock-framework.3207229.n2.nabble.com/Validate-exception-message-with-FailsWith-td7573288.html

дополнительно может быть, вы могли бы переопределить AbstractAnnotationDrivenExtension#visitSpec и добавить пользовательский приемник (переопределяет AbstractRunListener). Затем у вас есть доступ к методу AbstractRunListener#error, в документации которого указано:

Вызывается для каждой ошибки, которая возникает во время спецоперации. Может быть вызвано несколько раз для одного и того же метода, например, если оба блока * не выполняются.

Не проверял для Вопрос 2, но он может работать. Я использовал подобное.

Наслаждайтесь,

Tommy