web-dev-qa-db-ja.com

restAssuredを使用したSpring Boot Restアプリケーションのテスト

私はこれにしばらく苦労してきました。 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は、接続拒否の例外を取得しています。

このセットアップの何が問題なのでしょうか?

18
klubi

私はこの質問に自分で答えます。

追加の時間を費やした後、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);
    }

}

私は以前にこの方法で試したことを誓ったかもしれません...しかし、私はこれでいくつかの他の注釈を使用したと思います...

35
klubi

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);
    }
}
5
Mateus Costa

いくつかの非標準ポートで実行していますか?あなたはこれを試しましたか

@Before public static void init(){ RestAssured.baseURI = "http://localhost"; // replace as appropriate RestAssured.port = 8080; }

3
user3169330

その場合は@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
     }
 }
1
idmitriev

私は同じ問題を抱えていました、サーバーはポート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");
}
0
Amine Soumiaa

単に:

@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;
    }
0
erik