2013-07-06 8 views
20

Il mio prossimo livello di servizio di primavera test problema con Junit4 è: Come chiamare script che popola database solo una volta prima di tutti i metodi @Test: voglio eseguire questo una volta prima di tutti @Tests:Come popolare il database solo una volta prima dei metodi @Test nel test di primavera?

JdbcTestUtils.executeSqlScript(jdbcTemplate(), new FileSystemResource(
"src/main/resources/sql/mysql/javahelp-insert.sql"), false); 

ho provato per utilizzare @PostConstruct sulla mia classe GenericServiceTest (estesa dalle classi di test). Si è scoperto che @PostConstruct viene chiamato ogni volta prima di ogni metodo @Test. È interessante notare che anche i metodi annotati @Autowired di GenericServiceTest vengono chiamati prima di ogni metodo @Test.

Non desidero popolare il database prima di ogni classe di test, ma solo una volta all'avvio di Spring Test.

Come eseguire il metodo sopra solo una volta prima di tutti i metodi @Test con framework di test di primavera e junit4?

Grazie!

risposta

12

utilizzano molle incorporato il supporto di database

<jdbc:embedded-database id="dataSource"> 
    <jdbc:script location="classpath:myScript.sql"/> 
    <jdbc:script location="classpath:otherScript.sql"/> 
</jdbc:embedded-database> 

o supporto di database Springs inizializzazione

<jdbc:initialize-database data-source="dataSource"> 
    <jdbc:script location="classpath:myScript.sql"/> 
    <jdbc:script location="classpath:otherScript.sql"/> 
</jdbc:initialize-database> 

@see http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/jdbc.html#jdbc-embedded-database-support

+0

Grazie per la risposta! Devo provarlo! –

+0

@Volodymyr Levytskyi: se funziona, sentiti libero di accettare questa risposta. – Ralph

+0

funziona per MySQL5! –

10

Sulla Alfredos risposta, questo è un modo per iniettare informazioni del database senza chiamare lo script predefinito del database incorporato. Ad esempio, questo può essere utile quando vuoi costruire 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 metodo runOnce() è chiamato una sola volta per il test. Se si crea un campo istanza isInitialized (non statico), il metodo verrà chiamato prima di ogni test. In questo modo è possibile rilasciare/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 ragionevole per gestire il database è in accordo con la risposta di Ralph.

+1

'JdbcTestUtils.executeSqlScript (template, resource, true)' è deprecato con le versioni recenti di Spring, devi invece usare 'org.springframework.jdbc.datasource.init.DatabasePopulator' invece (' ResourceDatabasePopulator' e 'DatabasePopulatorUtils') – Tugdual