Ich habe schon seit einiger Zeit damit zu kämpfen ... Ich möchte restAssured verwenden, um meine SpringBoot REST -Anwendung zu testen.
Es sieht zwar so aus, als würde sich der Container richtig drehen, aber seien Sie versichert (und alles andere scheint Probleme zu haben, wenn Sie ihn erreichen.).
Immer wieder bekomme ich Connection-Ausnahme.
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)
...
meine Testklasse:
@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);
}
}
und jetzt für den seltsamen Teil, test
übergibt und druckt, was es soll, aber test2
erhält Connection-Ausnahme.
Irgendwelche Ideen, was ist mit diesem Setup falsch?
Ich beantworte diese Frage selbst ..
Nachdem mehr Zeit darauf verwendet wurde, stellte sich heraus, dass TestRestTemplate
den richtigen Port bereits kennt und einstellt.
Damit bin ich an einem Punkt angelangt, an dem der Test ohne Probleme abläuft.
@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);
}
}
Ich hätte schwören können, ich habe es schon früher so versucht ... Aber ich schätze, ich habe einige andere Anmerkungen dazu verwendet ...
Basierend auf https://stackoverflow.com/users/2838206/klubi antworten und den Port nicht für jede angeforderte Anforderung festlegen:
@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);
}
}
laufen Sie auf einem nicht standardmäßigen Port, kann es sein? Haben Sie dies in Ihrem versucht?
@Before
public static void init(){
RestAssured.baseURI = "http://localhost"; // replace as appropriate
RestAssured.port = 8080;
}
Ich würde empfehlen, @WebMvcTest
für diesen Fall zu verwenden.
<dependency>
<groupId>com.jayway.restassured</groupId>
<artifactId>spring-mock-mvc</artifactId>
<version>${rest-assured.version}</version>
<scope>test</scope>
</dependency>
Wenn Sie @SpringBootTest
verwenden, um zu testen, ob ein Controller Overhead ist, werden alle redundanten Beans wie @Component
, @Service
usw. erstellt und ein Vollständiger HTTP-Server gestartet. Für weitere Details: 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
}
}
Ich hatte das gleiche Problem. Der Server führte die App auf dem Port 34965 (nicht 8080) aus.
Das hat mein Problem gelöst:
@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");
}
Einfach:
@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;
}