Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment remplir la base de données une seule fois avant les méthodes @Test lors du test de printemps?

S'appuyant sur la réponse d'Alfredos, il s'agit d'un moyen d'injecter des informations dans la base de données sans appeler le script par défaut de la base de données intégrée. Par exemple, cela peut être utile lorsque vous souhaitez créer automatiquement le DDL pour vous - au moins dans les 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;
    }
}

De cette façon, le runOnce() La méthode est appelée une et une seule fois pour l'exécution du test. Si vous faites isInitialized un champ d'instance (non statique), la méthode sera appelée avant chaque test. De cette façon, vous pouvez supprimer/remplir les tables, si nécessaire, avant chaque test.

Notez qu'il s'agit toujours d'une solution plutôt rapide et sale et que la manière sensée de gérer la base de données est conforme à la réponse de Ralph.