How to populate database only once before @Test methods in spring test?

前端 未结 5 1428
小蘑菇
小蘑菇 2020-12-08 08:00

My next problem testing spring service layer with junit4 is: How to call script that populates database only once before all @Test methods: I want to execute this once befor

5条回答
  •  情话喂你
    2020-12-08 09:02

    Building on Alfredos answer, this is a way to inject database information without calling the embedded database's default script. For instance, this may be useful when you want to automagically build the DDL for you - at least in tests.

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration({"/applicationContext.xml"})
    public class TestClass {
    
        @Autowired
        private ApplicationContext ctx;
    
        private JdbcTemplate template;
    
        @Autowired
        public void setDataSource(DataSource dataSource) {
           template = new JdbcTemplate(dataSource);
        }
    
        private static boolean isInitialized = false;
    
        @Before
        public void runOnce() {
            if (isInitialized) return;
            System.out.println("Initializing database");
    
            String script = "classpath:script.sql"; 
            Resource resource = ctx.getResource(script);
            JdbcTestUtils.executeSqlScript(template, resource, true);            
            isInitialized = true;
        }
    }
    

    This way, the runOnce() method is called once and only once for the test run. If you make isInitialized an instance field (non-static), the method will be called before every test. This way you can drop/repopulate the tables, if necessary, before every test run.

    Note that this is still a rather quick-and-dirty solution and the sensible way to handle the database is in accordance with Ralph's answer.

提交回复
热议问题