2017-07-17 33 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() {/* ... */ } 
}