私はこれにしばらく苦労してきました。 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
は、接続拒否の例外を取得しています。
このセットアップの何が問題なのでしょうか?
私はこの質問に自分で答えます。
追加の時間を費やした後、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);
}
}
私は以前にこの方法で試したことを誓ったかもしれません...しかし、私はこれでいくつかの他の注釈を使用したと思います...
https://stackoverflow.com/users/2838206/klubi answerに基づき、作成するすべてのリクエストに対してポートを設定しないようにします。
@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);
}
}
いくつかの非標準ポートで実行していますか?あなたはこれを試しましたか
@Before public static void init(){ RestAssured.baseURI = "http://localhost"; // replace as appropriate RestAssured.port = 8080; }
その場合は@WebMvcTest
を使用することをお勧めします。必要なのは、mvc mvc依存関係を安心させることです。
<dependency>
<groupId>com.jayway.restassured</groupId>
<artifactId>spring-mock-mvc</artifactId>
<version>${rest-assured.version}</version>
<scope>test</scope>
</dependency>
@SpringBootTest
を使用してコントローラーのみをテストするとオーバーヘッドが発生し、@Component
、@Service
などのすべての冗長Beanが作成され、完全な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");
}
単に:
@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;
}