How can I mock db connection in Spring Boot for testing purpose?

31,602

There is an option to fake Spring bean with just plain Spring features. You need to use @Primary, @Profile and @ActiveProfiles annotations for it.

I wrote a blog post on the topic.

You can use in memory DB (e.g. H2) to replace real data source. Something like this:

@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();
    }
}
Share:
31,602
Rys
Author by

Rys

Updated on July 19, 2022

Comments

  • Rys
    Rys almost 2 years

    Situation:

    1. I am using Spring Cloud with Spring Boot in a microservice, that microservice is loading a DB config information to configure a connection.
    2. I created a test to get the rest interfaces using Swagger for documentation.
    3. I want to disable the loading of DB configuration because is not necessary.

    Here is the code:

    @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());
        }
    }
    

    How can I run the test without loading the database configuration? Is this possible?

  • deadbug
    deadbug over 4 years
    From the blog : As of Spring Boot 1.4.0, faking of Spring Beans is supported natively via annotation @MockBean. Read Spring Boot docs for more info.