Mysql
 sql >> Database >  >> RDS >> Mysql

Come popolare il database solo una volta prima dei metodi @Test nel test di primavera?

Basandosi sulla risposta di Alfredos, questo è un modo per iniettare informazioni sul database senza chiamare lo script predefinito del database incorporato. Ad esempio, questo può essere utile quando vuoi creare automaticamente il DDL per te, almeno nei test.

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

In questo modo, il runOnce() viene chiamato una volta e solo una volta per l'esecuzione del test. Se crei isInitialized un campo di istanza (non statico), il metodo verrà chiamato prima di ogni test. In questo modo puoi eliminare/ripopolare le tabelle, se necessario, prima di ogni esecuzione di test.

Si noti che questa è ancora una soluzione piuttosto rapida e sporca e il modo sensato di gestire il database è conforme alla risposta di Ralph.