2017-07-17 22 views
0

我为受保护资源编写集成测试,因此我必须登录,从请求中获取令牌,并在下一次测试中使用此令牌。Spock测试 - 从when子句向当地变量赋值

我想要做的象下面这样:

@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 

}

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

+1

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

回答

0

正常字段不在测试执行之间共享,如果您想共享它们,您需要用@spock.lang.Shared注释该字段。如果你想以确定性的顺序执行你的测试,那么你需要用@spock.lang.Stepwise注释你的规格。

@Stepwise 
class Test { 

    @Shared 
    String token 

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