web-dev-qa-db-ja.com

スプリングブートテスト-複数のテストで1つのコンテキストを共有できますか?

複数のスプリングブートテストクラスを作成しましたspring-boot1.4.

FirstActionTest.Java

@RunWith(SpringRunner.class)
@WebMvcTest(FirstAction.class)
@TestPropertySource("classpath:test-application.properties")
public class FirstActionTest {
    @Autowired
    private MockMvc mvc;

    // ...
}

SecondActionTest.Java

@RunWith(SpringRunner.class)
@WebMvcTest(SecondAction.class)
@TestPropertySource("classpath:test-application.properties")
public class SecondActionTest {
    @Autowired
    private MockMvc mvc;

    // ...
}

テストを実行する場合:

mvnテスト

それは私が推測する必要はない、各テストクラスのための春のテストコンテキストを作成したようです。

質問は:

  • 1つの春のテストコンテキストを複数のテストクラスで共有することは可能ですか?
14
Eric Wang

_@WebMvcTest_(つまり@WebMvcTest(FirstAction.class)および@WebMvcTest(SecondAction.class))で2つの異なるクラスを使用することにより、異なるアプリケーションコンテキストが必要であることを具体的に示しています。この場合、各コンテキストに異なるBeanのセットが含まれているため、単一のコンテキストを共有することはできません。コントローラーBeanが適切に動作している場合、コンテキストの作成は比較的速く、問題は発生しません。

キャッシュしてすべてのWebテストで共有できるコンテキストが本当に必要な場合は、コンテキストにまったく同じBean定義が含まれていることを確認する必要があります。思い浮かぶ2つのオプション:

1)コントローラを指定せずに_@WebMvcTest_を使用します。

FirstActionTest:

_@RunWith(SpringRunner.class)
@WebMvcTest
@TestPropertySource("classpath:test-application.properties")
public class FirstActionTest {
    @Autowired
    private MockMvc mvc;

    // ...
}
_

SecondActionTest:

_@RunWith(SpringRunner.class)
@WebMvcTest
@TestPropertySource("classpath:test-application.properties")
public class SecondActionTest {
    @Autowired
    private MockMvc mvc;

    // ...
}
_

2)_@WebMvcTest_を使用しないでください。これにより、すべてのBean(Web関連だけでなく)を含むアプリケーションコンテキストが得られます。

FirstActionTest:

_@RunWith(SpringRunner.class)
@SpringBootTest
@TestPropertySource("classpath:test-application.properties")
public class FirstActionTest {
    @Autowired
    private MockMvc mvc; // use MockMvcBuilders.webAppContextSetup to create mvc

    // ...
}
_

SecondActionTest:

_@RunWith(SpringRunner.class)
@SpringBootTest
@TestPropertySource("classpath:test-application.properties")
public class SecondActionTest {
    @Autowired
    private MockMvc mvc; // use MockMvcBuilders.webAppContextSetup to create mvc

    // ...
}
_

キャッシュされたコンテキストを使用すると、複数のテストをより速く実行できるようになりますが、開発時に単一のテストを繰り返し実行している場合は、大量のBeanを作成するコストがかかり、すぐに破棄されます。

9
Phil Webb