testing spring boot rest application with restAssured
I'll answer this question myself..
After spending additional amount of time on it it turned out that TestRestTemplate
already knows and sets proper port.
RestAssured does not...
With that I got to a point where below test runs without any issues.
@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);
}
}
I could have sworn I tried doing it this way previously... But I guess I did use some other annotations with this...
Based on https://stackoverflow.com/users/2838206/klubi answer and to not set the port for every request that you make:
@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);
}
}
I'd recommend to use @WebMvcTest
for that case, all you need is to have rest assured mock mvc dependency:
<dependency>
<groupId>com.jayway.restassured</groupId>
<artifactId>spring-mock-mvc</artifactId>
<version>${rest-assured.version}</version>
<scope>test</scope>
</dependency>
Using of @SpringBootTest
to test just a controller is overhead, all redundant beans, like @Component
, @Service
, etc, will be created and a
full HTTP server will be started. For more details:
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
}
}
are you running on some non-standard port may be? have you tried this in your
@Before
public static void init(){
RestAssured.baseURI = "http://localhost"; // replace as appropriate
RestAssured.port = 8080;
}