Skip to content

Commit cf887ea

Browse files
committed
Merge pull request #95 from DevFactory/df-docker-plugin-unit-tests
Unit tests to increase code coverage from 33% to 86%
2 parents 4a525bc + 7cf9daa commit cf887ea

14 files changed

+705
-13
lines changed

CODE_COVERAGE.md

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# Code Coverage Report generation
2+
3+
To generate the code coverage report, execute the following command:
4+
> mvn clean verify
5+
6+
This will generate code coverage report. In order to view it, open the following file in your browser
7+
> target/site/cobertura/index.html

pom.xml

+28
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,34 @@
147147

148148
<build>
149149
<plugins>
150+
<plugin>
151+
<groupId>org.codehaus.mojo</groupId>
152+
<artifactId>cobertura-maven-plugin</artifactId>
153+
<version>2.7</version>
154+
<configuration>
155+
<check>
156+
true
157+
</check>
158+
<formats>
159+
<format>html</format>
160+
</formats>
161+
<outputDirectory>${project.build.directory}/site/cobertura</outputDirectory>
162+
<instrumentation>
163+
<ignoreTrivial>true</ignoreTrivial>
164+
<excludes>
165+
<exclude>**/HelpMojo.class</exclude>
166+
</excludes>
167+
</instrumentation>
168+
</configuration>
169+
<executions>
170+
<execution>
171+
<phase>package</phase>
172+
<goals>
173+
<goal>cobertura</goal>
174+
</goals>
175+
</execution>
176+
</executions>
177+
</plugin>
150178
<plugin>
151179
<artifactId>maven-enforcer-plugin</artifactId>
152180
<version>1.3.1</version>

src/main/java/com/alexecollins/docker/mojo/AbstractDockerMojo.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import com.alexecollins.docker.orchestration.model.BuildFlag;
66
import com.alexecollins.docker.util.MavenLogAppender;
77
import com.github.dockerjava.api.DockerClient;
8-
import com.github.dockerjava.api.exception.DockerException;
8+
import com.github.dockerjava.api.DockerException;
99
import com.github.dockerjava.api.command.VersionCmd;
1010
import com.github.dockerjava.api.model.Version;
1111
import com.github.dockerjava.core.DockerClientBuilder;

src/test/java/com/alexecollins/docker/mojo/AbstractDockerMojoTest.java

+63-5
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,24 @@
11
package com.alexecollins.docker.mojo;
22

33
import com.alexecollins.docker.orchestration.DockerOrchestrator;
4+
import com.alexecollins.docker.orchestration.model.BuildFlag;
45
import com.github.dockerjava.api.DockerClient;
56
import org.apache.maven.plugin.MojoExecutionException;
67
import org.junit.Before;
78
import org.junit.Test;
89
import org.junit.runner.RunWith;
10+
import org.mockito.ArgumentCaptor;
911
import org.powermock.api.mockito.PowerMockito;
1012
import org.powermock.core.classloader.annotations.PrepareForTest;
1113
import org.powermock.modules.junit4.PowerMockRunner;
1214
import org.powermock.reflect.Whitebox;
1315

16+
import java.util.Set;
17+
18+
import static org.junit.Assert.assertEquals;
19+
import static org.junit.Assert.assertFalse;
20+
import static org.junit.Assert.assertNotNull;
21+
import static org.junit.Assert.assertTrue;
1422
import static org.junit.Assert.fail;
1523
import static org.mockito.Matchers.any;
1624
import static org.mockito.Mockito.doThrow;
@@ -24,25 +32,75 @@ public class AbstractDockerMojoTest extends MojoTestSupport {
2432

2533
private AbstractDockerMojo dockerMojo;
2634

35+
private DockerClient dockerClient;
36+
2737
@Before
2838
public void setUp() throws Exception {
29-
// prepare mojo
3039
dockerMojo = PowerMockito.spy(new AbstractDockerMojo() {
3140
@Override
3241
protected void doExecute(DockerOrchestrator orchestrator) throws Exception {
3342
// do nothing
3443
}
3544
});
45+
dockerClient = mock(DockerClient.class);
46+
47+
prepareMojo(dockerMojo, dockerClient, null);
48+
}
49+
50+
@Test
51+
public void testExecution() throws Exception {
52+
// given
53+
ArgumentCaptor<DockerOrchestrator> captor = ArgumentCaptor.forClass(DockerOrchestrator.class);
54+
55+
// when
56+
dockerMojo.execute();
57+
58+
// then
59+
verify(dockerMojo).doExecute(captor.capture());
60+
DockerOrchestrator capturedOrchestrator = captor.getValue();
61+
assertNotNull(capturedOrchestrator);
3662

37-
DockerClient mockDockerClient = mock(DockerClient.class);
38-
DockerOrchestrator mockDockerOrchestrator = mock(DockerOrchestrator.class);
63+
assertEquals(dockerClient, Whitebox.getInternalState(capturedOrchestrator, "docker"));
3964

40-
prepareMojo(dockerMojo, mockDockerClient, mockDockerOrchestrator);
65+
Set<BuildFlag> buildFlags = Whitebox.getInternalState(capturedOrchestrator, "buildFlags");
66+
assertNotNull(buildFlags);
67+
assertFalse(buildFlags.contains(BuildFlag.REMOVE_INTERMEDIATE_IMAGES));
68+
assertFalse(buildFlags.contains(BuildFlag.NO_CACHE));
69+
assertFalse(buildFlags.contains(BuildFlag.PULL));
70+
assertFalse(buildFlags.contains(BuildFlag.QUIET));
4171
}
4272

73+
@Test
74+
public void testExecutionWithFlags() throws Exception {
75+
// given
76+
Whitebox.setInternalState(dockerMojo, "removeIntermediateImages", true);
77+
Whitebox.setInternalState(dockerMojo, "cache", false);
78+
Whitebox.setInternalState(dockerMojo, "quiet", true);
79+
Whitebox.setInternalState(dockerMojo, "pull", true);
80+
81+
82+
ArgumentCaptor<DockerOrchestrator> captor = ArgumentCaptor.forClass(DockerOrchestrator.class);
4383

84+
// when
85+
dockerMojo.execute();
86+
87+
// then
88+
verify(dockerMojo).doExecute(captor.capture());
89+
DockerOrchestrator capturedOrchestrator = captor.getValue();
90+
assertNotNull(capturedOrchestrator);
91+
92+
assertEquals(dockerClient, Whitebox.getInternalState(capturedOrchestrator, "docker"));
93+
94+
Set<BuildFlag> buildFlags = Whitebox.getInternalState(capturedOrchestrator, "buildFlags");
95+
assertNotNull(buildFlags);
96+
assertTrue(buildFlags.contains(BuildFlag.REMOVE_INTERMEDIATE_IMAGES));
97+
assertTrue(buildFlags.contains(BuildFlag.NO_CACHE));
98+
assertTrue(buildFlags.contains(BuildFlag.PULL));
99+
assertTrue(buildFlags.contains(BuildFlag.QUIET));
100+
}
101+
44102
@Test
45-
public void testSkip() throws Exception {
103+
public void testExecutionWithSkip() throws Exception {
46104
// given
47105
Whitebox.setInternalState(dockerMojo, "skip", true);
48106

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package com.alexecollins.docker.mojo;
2+
3+
import com.alexecollins.docker.orchestration.DockerOrchestrator;
4+
import com.github.dockerjava.api.DockerClient;
5+
import org.junit.Before;
6+
import org.junit.Test;
7+
import org.junit.runner.RunWith;
8+
import org.powermock.api.mockito.PowerMockito;
9+
import org.powermock.core.classloader.annotations.PrepareForTest;
10+
import org.powermock.modules.junit4.PowerMockRunner;
11+
import org.powermock.reflect.Whitebox;
12+
13+
import static org.junit.Assert.assertEquals;
14+
import static org.mockito.Mockito.mock;
15+
import static org.mockito.Mockito.verify;
16+
17+
@RunWith(PowerMockRunner.class)
18+
@PrepareForTest(CopyMojo.class)
19+
public class CopyMojoTest extends MojoTestSupport {
20+
21+
private static final String SOURCE = "source";
22+
23+
private static final String DEST = "dest";
24+
25+
private CopyMojo copyMojo;
26+
27+
private DockerOrchestrator mockDockerOrchestrator;
28+
29+
@Before
30+
public void setUp() throws Exception {
31+
32+
copyMojo = PowerMockito.spy(new CopyMojo());
33+
DockerClient mockDockerClient = mock(DockerClient.class);
34+
mockDockerOrchestrator = mock(DockerOrchestrator.class);
35+
36+
prepareMojo(copyMojo, mockDockerClient, mockDockerOrchestrator);
37+
Whitebox.setInternalState(copyMojo, "resource", SOURCE);
38+
Whitebox.setInternalState(copyMojo, "dest", DEST);
39+
}
40+
41+
@Test
42+
public void testCopy() throws Exception {
43+
// when
44+
copyMojo.execute();
45+
46+
// then
47+
verify(copyMojo).doExecute(mockDockerOrchestrator);
48+
verify(mockDockerOrchestrator).copy(SOURCE, DEST);
49+
}
50+
51+
@Test
52+
public void testGetters() {
53+
assertEquals(SOURCE, copyMojo.getSource());
54+
assertEquals(DEST, copyMojo.getDest());
55+
}
56+
}
57+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package com.alexecollins.docker.mojo;
2+
3+
import com.alexecollins.docker.orchestration.DockerOrchestrator;
4+
import com.github.dockerjava.api.DockerClient;
5+
import org.junit.Before;
6+
import org.junit.Test;
7+
import org.junit.runner.RunWith;
8+
import org.powermock.api.mockito.PowerMockito;
9+
import org.powermock.core.classloader.annotations.PrepareForTest;
10+
import org.powermock.modules.junit4.PowerMockRunner;
11+
12+
import static org.mockito.Mockito.mock;
13+
import static org.mockito.Mockito.verify;
14+
15+
@RunWith(PowerMockRunner.class)
16+
@PrepareForTest(DeployMojo.class)
17+
public class DeployMojoTest extends MojoTestSupport {
18+
19+
private DeployMojo deployMojo;
20+
21+
private DockerOrchestrator mockDockerOrchestrator;
22+
23+
@Before
24+
public void setUp() throws Exception {
25+
26+
deployMojo = PowerMockito.spy(new DeployMojo());
27+
DockerClient mockDockerClient = mock(DockerClient.class);
28+
mockDockerOrchestrator = mock(DockerOrchestrator.class);
29+
30+
prepareMojo(deployMojo, mockDockerClient, mockDockerOrchestrator);
31+
}
32+
33+
@Test
34+
public void testDeploy() throws Exception {
35+
// when
36+
deployMojo.execute();
37+
38+
// then
39+
verify(deployMojo).doExecute(mockDockerOrchestrator);
40+
verify(mockDockerOrchestrator).push();
41+
}
42+
}

src/test/java/com/alexecollins/docker/mojo/MojoTestSupport.java

+29-7
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,23 @@
44
import com.github.dockerjava.api.DockerClient;
55
import com.github.dockerjava.api.command.VersionCmd;
66
import com.github.dockerjava.api.model.Version;
7+
import com.github.dockerjava.core.DockerClientBuilder;
8+
import com.github.dockerjava.core.DockerClientConfig;
79
import org.apache.maven.model.Build;
810
import org.apache.maven.project.MavenProject;
9-
import org.mockito.Mockito;
1011
import org.powermock.api.mockito.PowerMockito;
12+
import org.powermock.core.classloader.annotations.PrepareForTest;
1113
import org.powermock.reflect.Whitebox;
1214

15+
import java.io.File;
1316
import java.util.Properties;
1417

18+
import static org.mockito.Matchers.any;
1519
import static org.mockito.Mockito.mock;
1620
import static org.mockito.Mockito.when;
21+
import static org.powermock.api.mockito.PowerMockito.mockStatic;
1722

23+
@PrepareForTest(DockerClientBuilder.class)
1824
public class MojoTestSupport {
1925

2026
protected static final String PROJECT_GROUP_ID = "id.group";
@@ -27,10 +33,18 @@ public class MojoTestSupport {
2733

2834
protected static final String PROJECT_DESCRIPTION = "Project Description";
2935

30-
protected static final String BUILD_DIRECTORY = "/build/directory";
36+
protected static final String BUILD_DIR = "/build/dir";
3137

3238
protected static final String BUILD_FINAL_NAME = "buildFinalName";
3339

40+
protected static final String BASE_DIR = "src";
41+
42+
protected static final String SRC = "main";
43+
44+
protected static final String PREFIX = "prefix";
45+
46+
protected static final String USERNAME = "username";
47+
3448

3549
protected void prepareMojo(
3650
AbstractDockerMojo dockerMojo,
@@ -39,13 +53,20 @@ protected void prepareMojo(
3953

4054
MavenProject mavenProject = createMavenProject();
4155
Whitebox.setInternalState(dockerMojo, "project", mavenProject);
56+
Whitebox.setInternalState(dockerMojo, "prefix", PREFIX);
57+
Whitebox.setInternalState(dockerMojo, "src", SRC);
58+
Whitebox.setInternalState(dockerMojo, "username", USERNAME);
4259

4360
// prepare docker client
4461
if (mockDockerClient != null) {
4562
VersionCmd mockVersionCmd = mock(VersionCmd.class);
4663
Version mockVersion = mock(Version.class);
4764

48-
PowerMockito.doReturn(mockDockerClient).when(dockerMojo, "dockerClient");
65+
DockerClientBuilder mockDockerClientBuilder = mock(DockerClientBuilder.class);
66+
when(mockDockerClientBuilder.build()).thenReturn(mockDockerClient);
67+
68+
mockStatic(DockerClientBuilder.class);
69+
when(DockerClientBuilder.getInstance(any(DockerClientConfig.class))).thenReturn(mockDockerClientBuilder);
4970

5071
when(mockDockerClient.versionCmd()).thenReturn(mockVersionCmd);
5172
when(mockVersionCmd.exec()).thenReturn(mockVersion);
@@ -56,8 +77,8 @@ protected void prepareMojo(
5677
if (mockDockerOrchestrator != null) {
5778
PowerMockito.doReturn(mockDockerOrchestrator)
5879
.when(dockerMojo, "dockerOrchestrator",
59-
Mockito.any(Properties.class),
60-
Mockito.any(DockerClient.class)
80+
any(Properties.class),
81+
any(DockerClient.class)
6182
);
6283
}
6384
}
@@ -72,17 +93,18 @@ protected MavenProject createMavenProject() {
7293
mavenProject.setDescription(PROJECT_DESCRIPTION);
7394
mavenProject.setBuild(createBuild());
7495

96+
mavenProject.setFile(new File(new File(BASE_DIR), "file"));
97+
7598
return mavenProject;
7699
}
77100

78101
protected Build createBuild() {
79102

80103
Build build = new Build();
81104

82-
build.setDirectory(BUILD_DIRECTORY);
105+
build.setDirectory(BUILD_DIR);
83106
build.setFinalName(BUILD_FINAL_NAME);
84107

85108
return build;
86109
}
87-
88110
}

0 commit comments

Comments
 (0)