Dựa trên anwser của @dasblinkenlight và this anwser tôi đã đưa ra một thực hiện đối với trường hợp sử dụng của tôi mà tôi muốn chia sẻ.
Tôi sử dụng ServiceProviderPattern (difference API and SPI) cho các lớp triển khai giao diện IImporterService
. Nếu một triển khai mới của giao diện được phát triển, chỉ một tệp cấu hình trong số META-INF/services/ cần được thay đổi để đăng ký triển khai.
Tệp trong META-INF/services/ được đặt tên theo tên lớp đủ điều kiện của giao diện dịch vụ (IImporterService
), ví dụ:
de.myapp.importer.IImporterService
Tập tin này có chứa một danh sách các Cassés mà thực hiện IImporterService
, ví dụ
de.myapp.importer.impl.OfficeOpenXMLImporter
Lớp nhà máy ImporterFactory
cung cấp cho khách hàng với việc triển khai cụ thể của giao diện.
Các ImporterFactory
trả về một danh sách của tất cả các hiện thực của giao diện, đăng ký qua ServiceProviderPattern. Phương pháp setUp()
đảm bảo rằng một cá thể mới được sử dụng cho từng trường hợp thử nghiệm.
@RunWith(Parameterized.class)
public class IImporterServiceTest {
public IImporterService service;
public IImporterServiceTest(IImporterService service) {
this.service = service;
}
@Parameters
public static List<IImporterService> instancesToTest() {
return ImporterFactory.INSTANCE.getImplementations();
}
@Before
public void setUp() throws Exception {
this.service = this.service.getClass().newInstance();
}
@Test
public void testRead() {
}
}
Phương pháp ImporterFactory.INSTANCE.getImplementations()
trông giống như sau:
public List<IImporterService> getImplementations() {
return (List<IImporterService>) GenericServiceLoader.INSTANCE.locateAll(IImporterService.class);
}
Nguồn
2016-07-19 12:04:37
ý của bạn là "cùng một đối tượng được sử dụng để thực thi tất cả các thử nghiệm"? –
Là một cựu người nghiện junit, tôi chỉ muốn nói rằng bạn nên nhìn vào groovy/spock. Spock rất tuyệt và hấp dẫn mang lại cho bạn một số khả năng mà bạn không thể làm với junit. Một trong những điều yêu thích của tôi là truy cập các thành viên dữ liệu riêng tư, do đó bạn không cần phải vạch trần thứ gì đó chỉ để tạo ra một bài kiểm tra đơn vị thích hợp. – Thom