Java 在重新启动的情况下测试spring boot rest应用程序
我已经为此挣扎了一段时间了。 我想使用restasured来测试我的SpringBoot-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
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)
...