用restAssured测试spring boot rest应用程序

时间:2016-11-17 21:25:30

标签: java spring rest spring-boot rest-assured

我一直在努力解决这个问题。 我想使用restAssured来测试我的SpringBoot 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拒绝异常。

任何想法这个设置有什么问题?

8 个答案:

答案 0 :(得分:32)

我会自己回答这个问题..

在花费了额外的时间之后,事实证明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);
    }

}

我本来可以发誓我之前尝试过这样做...但我想我确实使用了其他一些注释......

答案 1 :(得分:5)

基于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);
    }
}

答案 2 :(得分:3)

你在某些非标准端口上运行可能吗? 你在

中尝试过这个吗?

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

答案 3 :(得分:1)

我建议在这种情况下使用@WebMvcTest,你只需要放心模拟mvc依赖:

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

使用@SpringBootTest来测试控制器只是开销,所有冗余bean,如@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
     }
 }

答案 4 :(得分:1)

您似乎正在尝试为Spring Web App编写集成测试。 REST-assured Support for Spring MockMvc on Baeldung包含有关如何执行此操作的信息。

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

    @Autowired
    private WebApplicationContext webApplicationContext;

    @Before
    public void initialiseRestAssuredMockMvcWebApplicationContext() {
        RestAssuredMockMvc.webAppContextSetup(webApplicationContext);
    }

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

在Baeldung中未提及的是Spring的静态进口变更。 REST-Assured Docs on Bootstrapping Spring
Import issues mentioned in another StackOverflow

请确保您使用:

import static io.restassured.module.mockmvc.RestAssuredMockMvc.*;
import static io.restassured.module.mockmvc.matcher.RestAssuredMockMvcMatchers.*;

不要与Spring一起使用:

import static io.restassured.RestAssured.*;
import static io.restassured.matcher.RestAssuredMatchers.*;

使用错误的导入可能导致连接被拒绝的异常。

答案 5 :(得分:0)

简单地:

@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 :(得分:0)

我有同样的问题,服务器在端口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 :(得分:-1)

"/clothes"作为参数传递给get()方法应解决问题

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