使用 restAssured 测试 spring boot rest 应用程序
testing spring boot rest application with restAssured
我已经为此苦苦挣扎了一段时间。
我想使用 restAssured 来测试我的 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)
...
我的测试class:
@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
正在获取连接被拒绝的异常。
知道这个设置有什么问题吗?
将 "/clothes"
作为参数传递给 get() 方法应该可以解决问题
@Test
public void test2() throws InterruptedException {
when().
get("/clothes").
then().
statusCode(200);
}
您是否 运行 在某些非标准端口上?
你在
中试过这个吗
@Before
public static void init(){
RestAssured.baseURI = "http://localhost"; // replace as appropriate
RestAssured.port = 8080;
}
我会自己回答这个问题..
在花费更多时间后,发现 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);
}
}
我发誓我以前尝试过这样做...但我想我确实使用了一些其他注释...
简单:
@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;
}
基于 https://whosebug.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);
}
}
我建议在这种情况下使用 @WebMvcTest
,您所需要的只是确保 mock 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
}
}
我有同样的问题,服务器是 运行 端口 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 应用程序编写集成测试。 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 Whosebug
确保使用:
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.*;
使用错误的导入会导致连接被拒绝异常。
当我从 @BeforeAll
静态 JUnit 方法调用 RestAssured 时,我遇到了同样的错误,所以我通过添加 @TestInstance(TestInstance.Lifecycle.PER_CLASS)
注释
使其成为非静态的
@BeforeAll
public void setUp() {
accessToken = getAuthorizationToken();
Util.deleteAllFromPassThroughCourseWorkList(accessToken);
}
而不是
@BeforeAll
public static void setUp() {
accessToken = getAuthorizationToken();
Util.deleteAllFromPassThroughCourseWorkList(accessToken);
}
灵感来自 here
我已经为此苦苦挣扎了一段时间。 我想使用 restAssured 来测试我的 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)
...
我的测试class:
@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
正在获取连接被拒绝的异常。
知道这个设置有什么问题吗?
将 "/clothes"
作为参数传递给 get() 方法应该可以解决问题
@Test
public void test2() throws InterruptedException {
when().
get("/clothes").
then().
statusCode(200);
}
您是否 运行 在某些非标准端口上? 你在
中试过这个吗
@Before
public static void init(){
RestAssured.baseURI = "http://localhost"; // replace as appropriate
RestAssured.port = 8080;
}
我会自己回答这个问题..
在花费更多时间后,发现 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);
}
}
我发誓我以前尝试过这样做...但我想我确实使用了一些其他注释...
简单:
@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;
}
基于 https://whosebug.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);
}
}
我建议在这种情况下使用 @WebMvcTest
,您所需要的只是确保 mock 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
}
}
我有同样的问题,服务器是 运行 端口 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 应用程序编写集成测试。 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 Whosebug
确保使用:
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.*;
使用错误的导入会导致连接被拒绝异常。
当我从 @BeforeAll
静态 JUnit 方法调用 RestAssured 时,我遇到了同样的错误,所以我通过添加 @TestInstance(TestInstance.Lifecycle.PER_CLASS)
注释
@BeforeAll
public void setUp() {
accessToken = getAuthorizationToken();
Util.deleteAllFromPassThroughCourseWorkList(accessToken);
}
而不是
@BeforeAll
public static void setUp() {
accessToken = getAuthorizationToken();
Util.deleteAllFromPassThroughCourseWorkList(accessToken);
}
灵感来自 here