Тестирование 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);
}