web-dev-qa-db-ja.com

テスト目的でSpring Bootでdb接続をモックするにはどうすればよいですか?

状況:

  1. 私は使っている Spring Cloud with Spring Bootマイクロサービスでは、そのマイクロサービスは接続を構成するためにDB構成情報をロードしています。
  2. ドキュメント用にSwaggerを使用して、残りのインターフェイスを取得するテストを作成しました。
  3. 必要がないため、DB構成の読み込みを無効にしたいのですが。

コードは次のとおりです。

@WebAppConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {Application.class, Swagger2MarkupTest.class}, loader = SpringApplicationContextLoader.class)
@ActiveProfiles("test")

public class Swagger2MarkupTest {

    @Autowired
    private WebApplicationContext context;

    private MockMvc mockMvc;

    @Autowired
    protected Environment env;

    @Before
    public void setUp() {
        this.mockMvc = MockMvcBuilders.webAppContextSetup(this.context).build();
    }

    @Test
    public void convertSwaggerToAsciiDoc() throws Exception {
        this.mockMvc.perform(get("/v2/api-docs").accept(MediaType.APPLICATION_JSON))
                .andDo(Swagger2MarkupResultHandler.outputDirectory("target/docs/asciidoc/generated")
                        .withExamples("target/docs/asciidoc/generated/exampless").build())
                .andExpect(status().isOk());
    }
}

データベース構成をロードせずにテストを実行するにはどうすればよいですか?これは可能ですか?

14
Rys

Springの単純な機能だけでSpring Beanを偽造するオプションがあります。 @Primary@Profileおよび@ActiveProfiles注釈を使用する必要があります。

このトピックに関するブログ記事を書きました。

メモリDB(H2など)で使用して、実際のデータソースを置き換えることができます。このようなもの:

@Configuration
public class TestingDataSourceConfig {

    @Bean
    @Primary
    public DataSource dataSource() {
        return new EmbeddedDatabaseBuilder()
            .generateUniqueName(true)
            .setType(H2)
            .setScriptEncoding("UTF-8")
            .ignoreFailedDrops(true)
            .addScript("schema.sql")
            .addScripts("user_data.sql", "country_data.sql")
            .build();
    }
}
17
luboskrnac