web-dev-qa-db-fra.com

Utilisation de l'annotation SpringBootTest

J'ai construit une API à l'aide de Spring Boot et je l'ai associé à quelques tests unitaires jusqu'à présent. Comme prévu, ils sont exécutés localement et lorsque Jenkins construit le projet via gradle build sur le serveur de construction. Je cherche à ajouter quelques tests d'intégration au projet en utilisant maintenant des tests de repos-assurés afin que je puisse réellement tester les demandes et les réponses, mais je ne sais pas trop comment les ajouter au projet. 

Jusqu'à présent, j'ai ajouté un dossier integrationTests à src/test et j'ai dit à Gradle d'exclure les tests repos-assurés lorsque gradle build ou via gradle test afin que je puisse les garder indépendants. J'ai configuré une tâche de gradation gradle integrationTest pour déclencher les tests d'intégration qui fonctionnent correctement tant que l'API est en cours d'exécution. 

Apparemment, je peux annoter la classe de test avec @SpringBootTest(webEnvironment=WebEnvironment.RANDOM_PORT) pour demander à spring de démarrer un serveur intégré pour effectuer des tests automatiquement, mais cela ne semble rien avoir. Les tests échouent simplement avec une erreur Java.net.ConnectException jusqu'à ce que je lance l'API dans une autre fenêtre. Y at-il un problème avec l'exemple de code ci-dessous ou est-ce que je manque quelque chose d'autre?

com.example.restassured;

import org.junit.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;

import static io.restassured.RestAssured.*;

@SpringBootTest(webEnvironment=WebEnvironment.RANDOM_PORT) 
public class RunSomeTestsIT {

    @Test public void url_should_return_200_response() {
       get("/v1/test/123456").then().statusCode(200);
    }

}

build.gradle

task integrationTest(type: Test) {
    include 'com/example/restassured/**'
    // Run all tests each time. Do not cache.
    outputs.upToDateWhen { false } 
}
3
Matt Damon

Par coïncidence, j'étais travaillant sur quelque chose de très similaire aujourd'hui , et j'espère pouvoir fournir quelques indications utiles.

Quand je compare avec ce code je pense qu'il vous manque l'annotation @RunWith(SpringRunner.class)!

Éditer: outre le fait de déplacer votre test dans le même package que la classe "Application", vous pouvez essayer une approche "premiers principes" de Spring qui élimine toute la magie noire des annotations Spring. Au moins, vous pourrez mieux résoudre les problèmes et contrôler ce qui se passe:

_ { https://github.com/ptrthomas/spring-testing/blob/master/src/test/Java/example/HelloE2ERestKarateTest.Java

1
Peter Thomas