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?
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 ...
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);
}
}
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;
}
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
}
}
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");
}
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;
}