2014-11-25 19 views
9

Tôi đang cố gắng để kết hợp các chú thích sau:Làm thế nào để thực hiện @Sql trước một phương pháp @Before

org.springframework.test.context.jdbc.Sqlorg.junit.Before

Giống như các mã sau:

@Test 
@Sql(scripts = "dml-parametro.sql") 
public void testData(){ 
    Iterable<Parametro> parametros = parametroService.findAll(); 
    List<Parametro> parametrosList = Lists.newArrayList(parametros); 

    Assert.assertThat(parametrosList.size(), Is.is(1)); 
} 

@Before 
public void beforeMethod() { 
    JdbcTestUtils.deleteFromTables(jdbcTemplate, "PARAMETRO"); 
} 

mã trong phương pháp @Before đang chạy sau đó kịch bản "DML-parametro.sql" trong chú thích @Sql.

Có quyền làm điều này?

Đối với giải pháp này, tôi đang sử dụng @After tại chỗ hơn @Before, nhưng tôi muốn cdelete bảng trước khi thực hiện kiểm tra, chứ không phải sau.

tôi sẽ không muốn sử dụng @SqlConfig. Tôi không sử dụng phạm vi transacional trên cấp độ thử nghiệm, vì vậy tôi cần phải làm sạch bảng của tôi trong mọi phương pháp thử nghiệm. Nếu mọi phương pháp thử cần phải làm sạch bảng, tôi muốn làm điều này trong phương thức @Trước. Tôi không muốn làm điều này trong mọi phương pháp thử nghiệm với @SqlConfig. Tôi nghĩ rằng hành vi của @Sql được thực hiện trước khi @Trước là sai.

Trả lời

31

Theo mặc định, mọi tập lệnh SQL được thực thi qua @Sql sẽ được thực thi trước bất kỳ phương thức nào @Before. Vì vậy, hành vi bạn đang gặp là chính xác, nhưng bạn có thể thay đổi giai đoạn thực hiện thông qua thuộc tính executionPhase trong @Sql (xem ví dụ bên dưới).

Nếu bạn muốn thực hiện nhiều kịch bản, mà cũng có thể thông qua @Sql.

Vì vậy, nếu bạn có một kịch bản dọn dẹp tên clean-parametro.sql rằng xóa từ bảng PARAMETRO, bạn có thể chú thích phương pháp thử nghiệm của bạn như sau (thay vì cách gọi JdbcTestUtils.deleteFromTables() trong phương pháp @Before của bạn).

@Test 
@Sql({"dml-parametro.sql", "clean-parametro.sql"}) 
public void test() { /* ... */ } 

Tất nhiên, nếu dml-parametro.sql chèn giá trị vào bảng PARAMETRO, sau đó nó có thể không có ý nghĩa để xóa ngay lập tức những giá trị đó trong kịch bản dọn dẹp.

Xin lưu ý rằng @Sql@SqlConfig cung cấp nhiều cấp cấu hình để thực thi tập lệnh.

Ví dụ, nếu bạn muốn tạo bảng trước khi thử nghiệm của bạn và dọn dẹp sau khi thử nghiệm của bạn, bạn có thể làm một cái gì đó như thế này trên Java 8:

@Test 
@Sql("create-tables.sql") 
@Sql(scripts = "clean-up.sql", executionPhase = AFTER_TEST_METHOD) 
public void test() { /* ... */ } 

Hoặc sử dụng @SqlGroup như một container trên Java 6 hoặc Java 7:

@Test 
@SqlGroup({ 
    @Sql("create-tables.sql"), 
    @Sql(scripts = "clean-up.sql", executionPhase = AFTER_TEST_METHOD) 
}) 
public void test() { /* ... */ } 

Nếu xét nghiệm của bạn là @Transactional và bạn muốn dọn dẹp nhà nước cơ sở dữ liệu đã cam kết, bạn có thể hướng dẫn xuân để thực hiện kịch bản SQL dọn dẹp của bạn trong một giao dịch mới như thế này:

@Test 
@Sql("insert-test-data.sql") 
@Sql(
    scripts = "clean-up.sql", 
    executionPhase = AFTER_TEST_METHOD, 
    config = @SqlConfig(transactionMode = ISOLATED) 
) 
public void test() { /* ... */ } 

Tôi hy vọng điều này làm rõ việc cho bạn!

Chúc mừng,

Sam (tác giả của TestContext Spring Framework)


Ghi chú:

  • AFTER_TEST_METHOD được tĩnh nhập khẩu từ ExecutionPhase
  • ISOLATED được tĩnh nhập khẩu từ TransactionMode
+0

tôi có một lớp trừu tượng được chú thích bằng '@ Sql' chạy một số tập lệnh và một lớp con của nó cũng được chú thích bằng' @ Sql'. khi tôi chạy spring boot 1.2, mọi thứ hoạt động như mong đợi -> các kịch bản lớp trừu tượng được chạy trước các scipts lớp con. nhưng một khi tôi nâng cấp lên khởi động mùa xuân 1.3, lớp con '@ Sql' bắt đầu ghi đè' 'Sql' của lớp cha trừu tượng và do đó các kịch bản lớp cha mẹ không bao giờ chạy. Tôi không biết phải làm gì bây giờ:/ –

+0

Tôi đã tạo một câu hỏi cho điều này, được tìm thấy ở đây: http://stackoverflow.com/questions/39296329/sub-classing-sql-annotated-class –

Các vấn đề liên quan