Tôi có một lớp BaseTest bao gồm một số bài kiểm tra. Mỗi bài kiểm tra sẽ được thực hiện cho danh sách MỌI hồ sơ tôi.Spring Boot/JUnit, chạy tất cả các bài kiểm tra đơn vị cho nhiều cấu hình
Tôi nghĩ về việc sử dụng các giá trị tham số như:
@RunWith(Parameterized.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
// @ActiveProfiles("h2-test") // <-- how to iterate over this?
public abstract class BaseTest {
@Autowired
private TestRepository test;
// to be used with Parameterized/Spring
private TestContextManager testContextManager;
public BaseTest(String profile) {
System.setProperty("spring.profiles.active", profile);
// TODO what now?
}
@Parameterized.Parameters
public static Collection<Object[]> data() {
Collection<Object[]> params = new ArrayList<>();
params.add(new Object[] {"h2-test" });
params.add(new Object[] {"mysql-test" });
return params;
}
@Before
public void setUp() throws Exception {
this.testContextManager = new TestContextManager(getClass());
this.testContextManager.prepareTestInstance(this);
// maybe I can spinup Spring here with my profile?
}
@Test
public void testRepository() {
Assert.assertTrue(test.exists("foo"))
}
Làm thế nào tôi sẽ nói với mùa xuân để chạy từng thử nghiệm với các cấu hình khác nhau? Trong thực tế, mỗi hồ sơ sẽ nói chuyện với các nguồn dữ liệu khác nhau (trong bộ nhớ h2, mysql bên ngoài, oracle bên ngoài, ..) vì vậy kho lưu trữ/nguồn dữ liệu của tôi phải được reinitialized.
tôi biết rằng tôi có thể chỉ định @ActiveProfiles (...) và tôi thậm chí có thể kéo dài từ BaseTest và ghi đè lên các chú thích ActiveProfile. Mặc dù điều này sẽ làm việc, tôi chỉ hiển thị một phần của bộ thử nghiệm của tôi. Rất nhiều lớp thử nghiệm của tôi mở rộng từ BaseTest và tôi không muốn tạo một số sơ yếu lý lịch khác nhau cho mỗi lớp. Hiện đang làm việc, nhưng giải pháp xấu xí:
- BaseTest (@ActiveProfiles ("mysql"))
- FooClassMySQL (chú thích từ BaseTest)
- FooClassH2 (@ActiveProfiles ("h2"))
- BarClassMySQL (chú thích từ BaseTest)
- BarClassH2 (@ActiveProfiles ("h2"))
- FooClassMySQL (chú thích từ BaseTest)
Cảm ơn
Tại sao không chạy tất cả các thử nghiệm có thông số, ví dụ: nếu bạn sử dụng Maven, nó có thể là 'mvn test -Dspring.profiles.active = test'. Tôi không chắc liệu bạn có thể đạt được nó bằng lớp tham số này hay không, chủ yếu là vì Spring hầu như sẽ khởi động ngữ cảnh của nó trước khi nó bắt đầu thực hiện kiểm thử của bạn và bạn phải thiết lập cấu hình hoạt động trước đó. –
Cảm ơn. Giải pháp rất đẹp mà tôi chưa từng nghĩ đến. Điều này chắc chắn sẽ làm gì nếu không có một cách thanh lịch để đối phó với nó trong mã! Tôi nghĩ rằng vấn đề duy nhất với điều này có thể chỉ là một vài thử nghiệm (trên thực tế, tất cả các kiểm tra kho lưu trữ/jpa của tôi), cần phải có các cấu hình khác nhau, trong khi những người khác không/cần truy cập các cấu hình khác nhau. – Frame91
Tuyệt! Tôi sẽ thêm nó như một câu trả lời nếu nó phù hợp với bạn. –