2017-07-17 19 views
0

保護されたリソースの統合テストを書くので、ログインしてリクエストからトークンを取得し、次のテストでこのトークンを使用する必要があります。スポークテスト - 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 

}

をテストトークンにはnull値があります。なぜ、どのようにしてこの問題を解決できますか?

+1

順番に実行中のテストに頼ったり、それらの間で状態を共有したりしないでください。これらの3行をメソッドに抽出し、各テストでそれを呼び出してトークンを取得するのはなぜですか? –

答えて

0

通常のフィールドはテスト実行間で共有されません。共有する場合は、フィールドに@spock.lang.Sharedという注釈を付ける必要があります。確定的な順序でテストを実行する場合は、スペックに@spock.lang.Stepwiseと注釈を付ける必要があります。

@Stepwise 
class Test { 

    @Shared 
    String token 

    def test1() {/* ... */ } 
    def test2() {/* ... */ } 
} 
関連する問題