web-dev-qa-db-fra.com

test de l'application des bottes à ressort avec restAssured

Cela fait quelque temps que je lutte avec cela .. Je voudrais utiliser restAssured pour tester mon application SpringBoot REST.

Bien qu'il semble que le conteneur vire correctement, soyez rassuré (et tout le reste semble avoir du mal à le toucher.

Tout le temps je reçois une exception refusée de Connection.

Java.net.ConnectException: Connection refused

at Java.net.PlainSocketImpl.socketConnect(Native Method)
at Java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.Java:350)
at Java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.Java:206)
at Java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.Java:188)
at Java.net.SocksSocketImpl.connect(SocksSocketImpl.Java:392)
at Java.net.Socket.connect(Socket.Java:589)
...

ma classe de test:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class SizesRestControllerIT {

    @Autowired
    private TestRestTemplate restTemplate;

    @Test
    public void test() {
        System.out.println(this.restTemplate.getForEntity("/clothes", List.class));
    }

    @Test
    public void test2() throws InterruptedException {
        given().basePath("/clothes").when().get("").then().statusCode(200);
    }

}

et maintenant pour la partie étrange, test passe et affiche ce qu’elle devrait, mais test2 obtient l’exception Connexion refusée.

Des idées ce qui ne va pas avec cette configuration?

16
klubi

Je vais répondre à cette question moi-même ..

Après avoir passé plus de temps dessus, il s'est avéré que TestRestTemplate sait déjà et définit le port approprié . RestAssured n'en a pas ...

Avec cela je suis arrivé à un point où le test ci-dessous s'exécute sans aucun problème.

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class SizesRestControllerIT {

    @LocalServerPort
    int port;

    @Before
    public void setUp() {
        RestAssured.port = port;
    }

    @Test
    public void test2() throws InterruptedException {
        given().basePath("/clothes").get("").then().statusCode(200);
    }

}

J'aurais juré avoir essayé de le faire de cette façon auparavant ... Mais je suppose que j'ai utilisé d'autres annotations avec ceci ...

31
klubi

Basé sur https://stackoverflow.com/users/2838206/klubi answer et pour ne pas définir le port pour chaque demande que vous effectuez:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = 
SpringBootTest.WebEnvironment.RANDOM_PORT)
public class SizesRestControllerIT {

    @LocalServerPort
    int port;

    @Before
    public void setUp() {
        RestAssured.port = port;
    }

    @Test
    public void test2() throws InterruptedException {
        given().basePath("/clothes").get("").then().statusCode(200);
    }
}
5
Mateus Costa

exécutez-vous sur un port non standard peut-être? 

@Before public static void init(){ RestAssured.baseURI = "http://localhost"; // replace as appropriate RestAssured.port = 8080; }

3
user3169330

Je recommanderais d'utiliser @WebMvcTest dans ce cas, tout ce dont vous avez besoin est d'avoir l'assurance de vous fier à la dépendance mvc:

<dependency>
            <groupId>com.jayway.restassured</groupId>
            <artifactId>spring-mock-mvc</artifactId>
            <version>${rest-assured.version}</version>
            <scope>test</scope>
</dependency>

L'utilisation de @SpringBootTest pour tester uniquement un contrôleur est une surcharge, tous les beans redondants, tels que @Component, @Service, etc., seront créés et un serveur HTTP .__ complet sera démarré. Pour plus d'informations: https://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#boot-features-testing-spring-boot-applications-testing-autoconfigured- mvc-tests ;

  @RunWith(SpringRunner.class)
  @WebMvcTest(value = SizesRestController.class)
  public class SizesRestControllerIT {

     @Autowired
     private MockMvc mvc;

     @Before
     public void setUp() {
        RestAssuredMockMvc.mockMvc(mvc);
     }

     @Test
     public void test() {
        RestAssuredMockMvc.given()
           .when()
           .get("/clothes")
           .then()
           .statusCode(200);
        // do some asserts
     }
 }
1
idmitriev

J'ai eu le même problème, le serveur exécutait l'application sur le port 34965 (pas 8080).

Cela a résolu mon problème: 

@Autowired
ServerProperties serverProperties;

@Autowired
Environment environment;

public String getPath() {
    final int port = environment.getProperty("local.server.port", Integer.class);

    return "http://localhost:" + port;
}

@Before
public void setUp() throws Exception {
    RestAssured.baseURI = getPath();
}

@Test
public void testResponse(){
    response = get("/books");
}
0
Amine Soumiaa

Simplement:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment= SpringBootTest.WebEnvironment.DEFINED_PORT)
public class CommonScenarioTest {

    @BeforeClass
    public static void setup() {
        RestAssured.baseURI = "http://localhost/foo";
        RestAssured.port = 8090;
    }
0
erik