我一直在努力解决这个问题。 我想使用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拒绝异常。
任何想法这个设置有什么问题?
答案 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);
}