2017-07-17 3 views
0

J'écris un test d'intégration pour les ressources protégées et je dois donc me connecter, obtenir le jeton de la requête et utiliser le jeton lors du prochain test.Spock testing - Attribuer une valeur de la clause when à la variable locale

Je voulais le faire comme ci-dessous:

@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 
    } 

Et je voulais utiliser jeton affecté dans le prochain test, mais je reçois 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 

}

Dans ce Le jeton de test a une valeur nulle. Pourquoi et comment puis-je résoudre ce problème?

+1

Vous ne devez pas compter sur des tests en cours d'exécution, ni partager un état entre eux. Pourquoi ne pas extraire ces 3 lignes dans une méthode, et appeler cela dans chaque test pour obtenir un jeton? –

Répondre

0

Les champs normaux ne sont pas partagés entre les exécutions de test. Si vous souhaitez les partager, vous devez annoter le champ avec @spock.lang.Shared. Si vous voulez exécuter vos tests dans un ordre déterministe, vous devez annoter votre spécification avec @spock.lang.Stepwise.

@Stepwise 
class Test { 

    @Shared 
    String token 

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