Java 在重新启动的情况下测试spring boot rest应用程序

Java 在重新启动的情况下测试spring boot rest应用程序,java,spring,rest,spring-boot,rest-assured,Java,Spring,Rest,Spring Boot,Rest Assured,我已经为此挣扎了一段时间了。 我想使用restasured来测试我的SpringBoot-REST应用程序 虽然看起来容器旋转正常,但请放心(其他任何东西似乎都有问题) 一直以来我都被拒绝连接 java.net.ConnectException: Connection refused at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.AbstractPlainSocketImpl.doConnect(Abs

我已经为此挣扎了一段时间了。 我想使用restasured来测试我的SpringBoot-REST应用程序

虽然看起来容器旋转正常,但请放心(其他任何东西似乎都有问题)

一直以来我都被拒绝连接

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
得到了连接拒绝异常

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)
...
你知道这个设置有什么问题吗?

“/coots”
作为参数传递给get()方法应该可以解决这个问题

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

您是否在某些非标准端口上运行? 你在家里试过这个吗


@以前
公共静态void init(){
RestAssured.baseURI=”http://localhost“;//根据需要替换
restasured.port=8080;
}

我自己来回答这个问题

在花费额外的时间之后,
testrestemplate
已经知道并设置了正确的端口。 重新发行不会

有了这一点,我达到了以下测试运行没有任何问题的程度

@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);
    }

}
我可以发誓我以前试过这样做……但我想我确实用了一些其他的注释……只是:

@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;
    }
根据回答,不要为您发出的每个请求设置端口:

@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);
    }
}

我建议您使用
@WebMvcTest
在这种情况下,您所需要的只是具有放心的模拟mvc依赖性:

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

我也有同样的问题,服务器在端口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");
}

看起来您正在尝试为Spring Web应用程序编写集成测试。提供了有关如何执行此操作的信息

@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的静态导入更改。

确保您使用:

import static io.restassured.module.mockmvc.RestAssuredMockMvc.*;
import static io.restassured.module.mockmvc.matcher.RestAssuredMockMvcMatchers.*;
请勿与弹簧一起使用:

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

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

不幸的是,这并没有改变任何东西
SpringBootTest.WebEnvironment.RANDOM_PORT
导致应用程序每次都在不同的端口上运行,然后可能是,`@Value(${local.server.PORT})int PORT;@在公共静态void init()之前{RestAssured.baseURI=“”;//根据需要替换RestAssured.port=port;}`现在您正在使用模拟/单元(容器外)测试,但是,问题是如何进行集成(端到端)测试请注意,对于Spring 2,只需稍加修改即可:
@ExtendWith(SpringExtension.class)使用Junit5(Jupiter)时,使用
代替
RunWith
@beforeach
代替
beforeach
。请注意,对于Spring 2,这只需稍加修改即可工作:
@extendedwith(SpringExtension.class)
代替
RunWith
@beforeach
代替
之前的
(Jupiter)。此答案和其他答案没有考虑到使用RANDOM_PORT将杀死Spring测试的事务管理。@事务将不起作用,测试将不再孤立。从长远来看,这将带来问题。
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)
...