2013-07-06 3 views
20

junit4と私の次の問題のテスト春のサービス層は、次のとおりです。私が試した春のテストで@Testメソッドの前に一度だけデータベースにデータを入れる方法は?

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

: 私は一度、すべての@Tests前にこれを実行したい:どのようにする前に、すべての@Testメソッド一度だけのデータベースを移入するスクリプトを呼び出すために GenericServiceTestクラス(テストクラスで拡張)で@PostConstructを使用する @PostConstructは@Testメソッドのたびに毎回呼び出されることが判明しました。興味深いのは、@Testメソッドの前にGenericServiceTestの@Autowiredアノテートされたメソッドが呼び出されることです。

私はすべてのテストクラスの前にデータベースを作成したくないですが、スプリングテストの起動時には1回だけ作成します。

上記のメソッドを実行するには、@テストメソッドの前に一度だけどのように実行すればよいのですか?

ありがとうございました!

答えて

12

利用スプリングス組込みデータベースのサポート

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

やスプリングの初期化データベースのサポート

<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

お返事ありがとうございます!私はそれを試してみる必要があります! –

+0

@Volodymyr Levytskyi:それがうまくいくならば、この答えを受け入れるように気をつけてください。 – Ralph

+0

はMySQL5で動作します! –

10

Alfredosの答えは上に構築、これは呼び出さずにデータベース情報を注入する方法です組み込みデータベースのデフォルトスクリプト。たとえば、少なくともテストでは、自動的にDDLを構築する場合に便利です。

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

このようにして、runOnce()メソッドはテスト実行のために一度だけ呼び出されます。 isInitializedをインスタンスフィールド(非静的)にすると、メソッドはすべてのテストの前に呼び出されます。この方法では、必要に応じて、テストを実行する前にテーブルを削除/再投入することができます。

これは依然として迅速で汚れた解決策であり、データベースを処理する賢明な方法はRalphの答えに従っていることに注意してください。

+1

'JdbcTestUtils.executeSqlScript(template、resource、true)'はSpringの最新バージョンでは非推奨です。代わりに 'org.springframework.jdbc.datasource.init.DatabasePopulator'を使用する必要があります(' ResourceDatabasePopulator'と 'DatabasePopulatorUtils') – Tugdual

関連する問題