Dựa trên kinh nghiệm của tôi viết Maven plugin, có là hai cấp độ thử nghiệm một plugin: thông qua kiểm tra đơn vị (sử dụng mocks) và thông qua các bài kiểm tra tích hợp (bằng cách sử dụng plugin maven-invoker).
Đối với các bài kiểm tra tích hợp, các nguyên mẫu maven cho plugin maven mới đã cung cấp một ví dụ điển hình ra khỏi hộp, chỉ cần thực hiện như sau và có một cái nhìn vào nó:
mvn archetype:generate \
-DgroupId=sample.plugin \
-DartifactId=hello-maven-plugin \
-DarchetypeGroupId=org.apache.maven.archetypes \
-DarchetypeArtifactId=maven-archetype-plugin
Theo mặc định, bạn sẽ nhận hội nhập kiểm tra trong hồ sơ để bắt đầu. Một dự án maven ví dụ cũng sẽ có sẵn (dưới src \ it \ simple-it \ pom.xml) có thể thực hiện các mục tiêu plugin của bạn. Những gì tôi đề nghị cũng là để thực thi kết quả kiểm tra tích hợp của bạn thông qua các ràng buộc bổ sung trong tệp pom.xml đó. Ví dụ: bạn có thể thêm quy tắc Maven Enforcer Plugin để kiểm tra các tệp đã tạo, nếu điều đó có ý nghĩa đối với plugin của bạn.
Để trả lời cụ thể hơn cho câu hỏi của bạn về cách viết các unit test cho maven tùy chỉnh plugin, đây là cách tiếp cận tôi đang sử dụng:
- JUnit + Mockito.
- Trường hợp thử nghiệm đang chạy bằng @RunWith (MockitoJUnitRunner.class)
- Các lớp Maven cụ thể Maven (MavenProject, Nhật ký, Xây dựng, DependencyNode, v.v.) Sử dụng @Mock chú thích
- Tiến hành và liên kết các đối tượng giả của bạn trong một phương pháp @Before (thường là thiết lập() phương pháp)
- thử nghiệm plugin của bạn :)
Ví dụ, bạn có thể có chế giễu sau đây đối tượng như biến lớp học của đơn vị kiểm tra của bạn:
@Mock
private MavenProject project;
@Mock
private Log log;
@Mock
Build build;
sau đó, trong phương pháp @Before của bạn, bạn cần phải thêm một lớn của mã keo như sau:
Mockito.when(this.project.getBuild()).thenReturn(this.build);
Ví dụ, tôi sử dụng để viết một số tùy chỉnh Enforcer Plugin quy tắc, vì vậy tôi cần
@Mock
private EnforcerRuleHelper helper;
Và trong phương pháp @Before:
Mockito.when(this.helper.evaluate("${project}")).thenReturn(this.project);
Mockito.when(this.helper.getLog()).thenReturn(this.log);
Mockito.when(this.project.getBuild()).thenReturn(this.build);
Mockito.when(this.helper.getComponent(DependencyGraphBuilder.class)).thenReturn(this.graphBuilder);
Mockito.when(this.graphBuilder.buildDependencyGraph(this.project, null)).thenReturn(this.node);
Như vậy, nó sẽ dễ dàng sử dụng các giả lập các đối tượng vào thử nghiệm của bạn. Ví dụ, phải có kiểm tra giả đầu tiên là để kiểm tra nó chống lại một build rỗng như sau (sau đây thử nghiệm một quy tắc Enforcer tùy chỉnh):
@Test
public void testEmptyBuild() throws Exception {
try {
this.rule.execute(this.helper);
} catch (EnforcerRuleException e) {
Assert.fail("Rule should not fail");
}
}
Nếu bạn cần phải kiểm tra chống lại phụ thuộc của xây dựng của bạn, ví dụ, bạn có thể kết thúc bằng văn bản phương pháp hữu ích như sau:
private static DependencyNode generateNode(String groupId, String artifactId, String version) {
DependencyNode node = Mockito.mock(DependencyNode.class);
Artifact artifact = Mockito.mock(Artifact.class);
Mockito.when(node.getArtifact()).thenReturn(artifact);
// mock artifact
Mockito.when(artifact.getGroupId()).thenReturn(groupId);
Mockito.when(artifact.getArtifactId()).thenReturn(artifactId);
Mockito.when(artifact.getVersion()).thenReturn(version);
return node;
}
để dễ dàng tạo ra phụ thuộc vào đồ thị phụ thuộc của xây dựng của bạn, như sau:
List<DependencyNode> nodes = new ArrayList<DependencyNode>();
nodes.add(generateNode("junit", "junit", "4.12"));
Mockito.when(node.getChildren()).thenReturn(nodes);
LƯU Ý: yo u có thể cải thiện các phương pháp tiện ích nếu bạn cần thêm chi tiết (như phạm vi hoặc phân loại cho một phụ thuộc).
Nếu bạn cũng cần phải cấu hình mô hình của một plugin, bởi vì bạn cần phải quét plugin hiện có và cấu hình của họ, ví dụ, bạn có thể làm điều đó như sau:
List<Plugin> plugins = new ArrayList<Plugin>();
Plugin p = new Plugin(); // no need to mock it
p.setArtifactId("maven-surefire-plugin");
Xpp3Dom conf = new Xpp3Dom("configuration");
Xpp3Dom skip = new Xpp3Dom("skip");
skip.setValue("true");
conf.addChild(skip);
p.setConfiguration(conf);
plugins.add(p);
Mockito.when(this.build.getPlugins()).thenReturn(plugins);
tôi sẽ rõ ràng không bao gồm tất cả các các trường hợp có thể xảy ra, nhưng tôi chắc chắn bạn có hiểu biết về cách tiếp cận và cách sử dụng. Hy vọng nó giúp.
bất kỳ tin tức nào về điều này? điều này sẽ rất hữu ích – pigiuz
không có tin tức ở đây, nhưng có lẽ bỏ phiếu lên câu hỏi sẽ giúp ?! :-) – dermoritz