2013-10-30 17 views
6

Tôi muốn viết bài kiểm tra đơn vị (junit4) cho maven-plugin của tôi. Tất cả các ví dụ tôi tìm thấy sử dụng "AbstractMojoTestCase" (junit3 :-() Để thoát khỏi điều này tôi đã nhận answer here Nhưng vấn đề là như thế nào Mojos được khởi tạo:..Làm thế nào để thử maven plugin môi trường và hoặc cấu hình dự án

MyMojo myMojo = (MyMojo) lookupMojo("touch", pom); 

Điều đó có nghĩa tôi cần một pom cho mỗi trường hợp thử nghiệm - pom là dữ liệu đầu vào thử nghiệm.Nhưng có cách nào để giả lập (tôi sẽ sử dụng Mockito) mô hình dự án một số cách như thế nào? Có thể lookupMojo(String groupId, String artifactId, String version, String goal, PlexusConfiguration pluginConfiguration) là điểm khởi đầu tốt không? Trong trường hợp này tôi sẽ giả lập "PlexusConfiguration", nhưng phương pháp nào ? Một số maven-plugin testing doku sử dụng các lớp như "MavenProjectStub". Nhưng tôi không thể có được một bức tranh nhất quán về cách mojo được tạo ra và những gì intefaces nó nói về sáng tạo.

Một giải pháp hoàn hảo sẽ là nếu tôi chỉ

@inject 
MyMojo testObject; 

và chỉ có thể thử tất cả những thứ nó cần phải làm cho nó làm việc (chính tôi cần @Parameters)

+0

bất kỳ tin tức nào về điều này? điều này sẽ rất hữu ích – pigiuz

+0

không có tin tức ở đây, nhưng có lẽ bỏ phiếu lên câu hỏi sẽ giúp ?! :-) – dermoritz

Trả lời

5

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.

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