3

我正在与:

  • 斯波克核心
  • 斯波克报告
  • 斯波克弹簧
  • 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通过Spock Reports看到

问题一:我怎样才能看到reasonSpock Reports?。

我知道 Spock 提供了throw()方法,因此我能够做到:

  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"

但只是好奇是否可以解决问题二..

4

1 回答 1

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其文档中显示的方法:

为规范运行期间发生的每个错误调用。可以为同一个方法多次调用,例如,如果一个特性方法的期望块和清理块都失败了。

没有测试问题二,但它可能有效。我用过类似的东西。

享受,

汤米

于 2015-12-01T15:17:48.553 回答