2013-07-06 22 views
20

tới vấn đề kiểm tra lớp dịch vụ xuân của tôi với Junit4 là: Làm thế nào để gọi script mà populates cơ sở dữ liệu một lần duy nhất trước khi tất cả các phương pháp @Test: tôi muốn thực hiện điều này một lần trước khi tất cả @Tests:Làm cách nào để điền cơ sở dữ liệu chỉ một lần trước các phương pháp @Test trong thử nghiệm mùa xuân?

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

tôi đã cố gắng để sử dụng @PostConstruct trên lớp GenericServiceTest của tôi (được mở rộng bởi các lớp thử nghiệm). Hóa ra rằng @PostConstruct được gọi mỗi lần trước mỗi phương thức @Test. Thú vị là ngay cả các phương thức được chú thích @Autowired của GenericServiceTest được gọi trước mọi phương thức @Test.

Tôi không muốn điền cơ sở dữ liệu trước mỗi lớp thử nghiệm nhưng chỉ một lần khi khởi động thử nghiệm vào mùa xuân.

Cách chỉ thực hiện phương pháp trên một lần trước tất cả các phương pháp @Test với khung kiểm tra lò xo và junit4?

Cảm ơn bạn!

Trả lời

12

Sử dụng Springs Embedded Cơ sở dữ liệu Hỗ trợ

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

hoặc Springs Initialize Hỗ trợ cơ sở dữ liệu

<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

Cảm ơn bạn đã trả lời! Tôi phải thử nó! –

+0

@Volodymyr Levytskyi: nếu nó hoạt động, sau đó cảm thấy tự do để chấp nhận câu trả lời này. – Ralph

+0

hoạt động cho MySQL5! –

10

xây dựng trên Alfredos câu trả lời, đây là một cách để bơm thông tin cơ sở dữ liệu mà không gọi tập lệnh mặc định của cơ sở dữ liệu được nhúng. Ví dụ, điều này có thể hữu ích khi bạn muốn tự động xây dựng DDL cho bạn - ít nhất là trong các thử nghiệm.

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

Cách này, phương pháp runOnce() được gọi một lần và chỉ một lần để chạy thử nghiệm. Nếu bạn thực hiện isInitialized trường thể hiện (không tĩnh), phương pháp sẽ được gọi trước mỗi lần kiểm tra. Bằng cách này bạn có thể thả/repopulate các bảng, nếu cần thiết, trước khi chạy thử nghiệm.

Lưu ý rằng đây vẫn là giải pháp khá nhanh và bẩn và cách hợp lý để xử lý cơ sở dữ liệu phù hợp với câu trả lời của Ralph.

+1

'JdbcTestUtils.executeSqlScript (mẫu, tài nguyên, true)' không được chấp nhận với các phiên bản Spring gần đây, bạn phải sử dụng 'org.springframework.jdbc.datasource.init.DatabasePopulator' thay vào đó (' ResourceDatabasePopulator' và 'DatabasePopulatorUtils') – Tugdual