【问题标题】:Spock testing - assign value from when clause to local variableSpock 测试 - 将值从 when 子句分配给局部变量
【发布时间】:2017-07-17 09:16:33
【问题描述】:

我为受保护的资源编写集成测试,因此我必须登录,从请求中获取令牌,并在下一个测试中使用此令牌。

我想像下面这样:

@Autowired
private TestRestTemplate restTemplate

private String token

def 'login'() {
        given:
            final UserData userData = new UserData("User", "Password")

        when:
            def response = restTemplate.postForEntity('/login', userData, Object)
// assign token to variable
            this.token = response.getHeaders().get("Authorization")

        then:
            response.getStatusCode() == HttpStatus.OK
            response.getHeaders().get("Authorization") != null
    }

我想在下一个测试中使用分配的令牌,但我得到 NUllPointerException:

def 'request test'() {

    final MultiValueMap<String, String> headers = new LinkedMultiValueMap<>()
    headers.add("Authorization", token)
    final HttpEntity request = new HttpEntity(headers)

when:
    def response = rest.exchange('/test', HttpMethod.GET, request, new ParameterizedTypeReference<String>() {})

then:
    response.getStatusCode() == HttpStatus.OK

}

在此测试中,令牌具有空值。为什么以及如何解决这个问题?

【问题讨论】:

  • 您不应该依赖按顺序运行的测试,或者在它们之间共享状态。为什么不将这 3 行提取到一个方法中,并在每个测试中调用它以获取令牌?

标签: spring groovy integration-testing spock


【解决方案1】:

普通字段不会在测试执行之间共享,如果您想共享它们,您需要使用 @spock.lang.Shared 注释该字段。如果您想以确定的顺序执行测试,则需要使用 @spock.lang.Stepwise 注释您的规范。

@Stepwise
class Test {

  @Shared
  String token

  def test1() {/* ... */ }
  def test2() {/* ... */ }
}

【讨论】:

    猜你喜欢
    • 2011-06-16
    • 1970-01-01
    • 2019-03-20
    • 2017-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多