Тестирование spring приложения для загрузки с restAssured
Я боролся с этим в течение некоторого времени.
Я хотел бы использовать restAssured для тестирования моего приложения RESTBEST REST.
Пока похоже, что контейнер вращается правильно, будьте уверены (и у чего-то еще есть проблемы, связанные с ним.
Все время, когда я получаю 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)
...
мой тестовый класс:
@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);
}
}
и теперь для странной части test
передает и печатает то, что должно, но test2
получает отказ от отказа Connection.
Любые идеи, что не так с этой настройкой?
Ответы
Ответ 1
Я сам отвечу на этот вопрос.
Проведя дополнительное время, выяснилось, что TestRestTemplate
уже знает и устанавливает правильный порт. RestAssured не...
С этим я дошел до точки, где ниже тест проходит без каких-либо проблем.
@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);
}
}
Я мог бы поклясться, что раньше пытался это сделать... Но, наверное, я использовал некоторые другие аннотации с этим...
Ответ 2
На основе https://stackoverflow.com/users/2838206/klubi ответьте и не устанавливайте порт для каждого сделанного вами запроса:
@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);
}
}
Ответ 3
Возможно, вы работаете на каком-то нестандартном порту?
вы пробовали это в своем
@Before
public static void init(){
RestAssured.baseURI = "http://localhost"; // replace as appropriate
RestAssured.port = 8080;
}
Ответ 4
Я бы рекомендовал использовать @WebMvcTest
для этого случая, все, что вам нужно - это обеспечить уверенную зависимость mkc от mvc:
<dependency>
<groupId>com.jayway.restassured</groupId>
<artifactId>spring-mock-mvc</artifactId>
<version>${rest-assured.version}</version>
<scope>test</scope>
</dependency>
Использование @SpringBootTest
для проверки только контроллера - это служебные данные, все избыточные beans, такие как @Component
, @Service
и т.д., будут созданы и
будет запущен полный HTTP-сервер. Больше подробностей:
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
}
}
Ответ 5
Просто:
@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;
}
Ответ 6
У меня была такая же проблема: на сервере было приложение App на порт 34965 (не 8080).
Это решило мою проблему:
@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");
}
Ответ 7
Передача "/clothes"
в качестве параметра метода get() должна решить проблему
@Test
public void test2() throws InterruptedException {
when().
get("/clothes").
then().
statusCode(200);
}