Skip to content

Commit 0829fc6

Browse files
authored
Merge pull request #5 from json-snapshot/extractArgs
Includes SnapshotUtils with extractArgs for Mockito mocks
2 parents 56925b5 + cf2026d commit 0829fc6

File tree

9 files changed

+158
-2
lines changed

9 files changed

+158
-2
lines changed

pom.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,11 @@
7171
<artifactId>assertj-core</artifactId>
7272
<version>3.8.0</version>
7373
</dependency>
74+
<dependency>
75+
<groupId>org.mockito</groupId>
76+
<artifactId>mockito-all</artifactId>
77+
<version>1.10.19</version>
78+
</dependency>
7479
<dependency>
7580
<groupId>org.slf4j</groupId>
7681
<artifactId>slf4j-api</artifactId>
@@ -85,6 +90,7 @@
8590
<version>4.12</version>
8691
<scope>test</scope>
8792
</dependency>
93+
8894
</dependencies>
8995

9096
<build>

src/main/java/io/github/jsonSnapshot/SnapshotMatcher.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,23 @@
33
import org.apache.commons.lang3.ArrayUtils;
44
import org.apache.commons.lang3.StringUtils;
55
import org.assertj.core.util.Arrays;
6+
import org.mockito.ArgumentCaptor;
7+
import org.mockito.verification.VerificationMode;
68
import org.slf4j.Logger;
79
import org.slf4j.LoggerFactory;
810

911
import java.io.IOException;
12+
import java.lang.reflect.InvocationTargetException;
1013
import java.lang.reflect.Method;
14+
import java.lang.reflect.Parameter;
1115
import java.util.ArrayList;
16+
import java.util.HashMap;
1217
import java.util.List;
1318
import java.util.stream.Collectors;
1419

20+
import static org.mockito.Mockito.atLeastOnce;
21+
import static org.mockito.Mockito.verify;
22+
1523
public class SnapshotMatcher {
1624

1725
private static Logger log = LoggerFactory.getLogger(SnapshotMatcher.class);
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package io.github.jsonSnapshot;
2+
3+
import org.mockito.ArgumentCaptor;
4+
5+
import java.lang.reflect.Parameter;
6+
import java.util.ArrayList;
7+
import java.util.HashMap;
8+
import java.util.LinkedHashMap;
9+
import java.util.List;
10+
11+
import static org.mockito.Mockito.atLeastOnce;
12+
import static org.mockito.Mockito.verify;
13+
14+
public class SnapshotUtils {
15+
16+
public static <T> HashMap<String, List<LinkedHashMap<String, Object>>> extractArgs(T object, String methodName,
17+
Class... classes) {
18+
List<ArgumentCaptor> captors = new ArrayList<>();
19+
HashMap<String, List<LinkedHashMap<String, Object>>> result = new HashMap<>();
20+
21+
for (Class clazz : classes) {
22+
captors.add(ArgumentCaptor.forClass(clazz));
23+
}
24+
25+
try {
26+
Parameter[] parameters = object.getClass().getMethod(methodName, classes).getParameters();
27+
28+
object.getClass()
29+
.getMethod(methodName, classes)
30+
.invoke(verify(object, atLeastOnce()), captors.stream().map(ArgumentCaptor::capture).toArray());
31+
32+
33+
List<LinkedHashMap<String, Object>> extractedObjects = new ArrayList<>();
34+
35+
int numberOfCall;
36+
37+
if (captors.size() > 0) {
38+
numberOfCall = captors.get(0).getAllValues().size();
39+
40+
for (int i = 0; i < numberOfCall; i++) {
41+
LinkedHashMap<String, Object> objectMap = new LinkedHashMap<>();
42+
43+
int j = 0;
44+
for (ArgumentCaptor captor : captors) {
45+
objectMap.put(parameters[j].getName(), captor.getAllValues().get(i));
46+
j++;
47+
}
48+
extractedObjects.add(objectMap);
49+
}
50+
}
51+
52+
result.put(object.getClass().getSuperclass().getSimpleName() + "." + methodName, extractedObjects);
53+
} catch (Exception e) {
54+
throw new SnapshotMatchException(e.getMessage());
55+
}
56+
57+
return result;
58+
}
59+
}

src/test/java/io/github/jsonSnapshot/FakeObject.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import lombok.Builder;
44
import lombok.Setter;
55

6+
import java.util.List;
7+
68
@Builder
79
public class FakeObject {
810

@@ -15,4 +17,9 @@ public class FakeObject {
1517
@Setter
1618
private FakeObject fakeObject;
1719

20+
21+
public void fakeMethod(String fakeName, Long fakeNumber, List<String> fakeList) {
22+
23+
}
24+
1825
}

src/test/java/io/github/jsonSnapshot/SnapshotIntegrationTest.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
11
package io.github.jsonSnapshot;
22

3+
import org.hamcrest.core.StringStartsWith;
34
import org.junit.AfterClass;
45
import org.junit.BeforeClass;
56
import org.junit.Rule;
67
import org.junit.Test;
78
import org.junit.rules.ExpectedException;
9+
import org.junit.runner.RunWith;
10+
import org.mockito.runners.MockitoJUnitRunner;
811

912
import static io.github.jsonSnapshot.SnapshotMatcher.*;
10-
import static org.hamcrest.CoreMatchers.startsWith;
1113

14+
@RunWith(MockitoJUnitRunner.class)
1215
public class SnapshotIntegrationTest {
1316

1417
@Rule
@@ -47,7 +50,7 @@ public void shouldMatchSnapshotFour() {
4750
@Test
4851
public void shouldThrowSnapshotMatchException() {
4952
expectedException.expect(SnapshotMatchException.class);
50-
expectedException.expectMessage(startsWith("Error on: \n" +
53+
expectedException.expectMessage(StringStartsWith.startsWith("Error on: \n" +
5154
"io.github.jsonSnapshot.SnapshotIntegrationTest.shouldThrowSnapshotMatchException=["));
5255
expect(FakeObject.builder().id("anyId5").value(6).name("anyName5").build()).toMatchSnapshot();
5356
}

src/test/java/io/github/jsonSnapshot/SnapshotMatcherTest.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22

33
import org.apache.commons.lang3.StringUtils;
44
import org.junit.*;
5+
import org.junit.runner.RunWith;
56
import org.junit.runners.MethodSorters;
7+
import org.mockito.runners.MockitoJUnitRunner;
68

79
import java.io.File;
810
import java.io.IOException;
@@ -11,6 +13,7 @@
1113

1214
import static org.assertj.core.api.Assertions.assertThat;
1315

16+
@RunWith(MockitoJUnitRunner.class)
1417
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
1518
public class SnapshotMatcherTest {
1619

src/test/java/io/github/jsonSnapshot/SnapshotTest.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import org.junit.After;
44
import org.junit.Before;
55
import org.junit.Test;
6+
import org.junit.runner.RunWith;
7+
import org.mockito.runners.MockitoJUnitRunner;
68

79
import java.io.IOException;
810
import java.nio.file.Files;
@@ -12,6 +14,7 @@
1214

1315
import static org.assertj.core.api.Assertions.assertThat;
1416

17+
@RunWith(MockitoJUnitRunner.class)
1518
public class SnapshotTest {
1619

1720
private static final String FILE_PATH = "src/test/java/anyFilePath";
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package io.github.jsonSnapshot;
2+
3+
import org.junit.AfterClass;
4+
import org.junit.BeforeClass;
5+
import org.junit.Test;
6+
import org.junit.runner.RunWith;
7+
import org.mockito.Mock;
8+
import org.mockito.runners.MockitoJUnitRunner;
9+
10+
import java.util.Arrays;
11+
import java.util.HashMap;
12+
import java.util.List;
13+
14+
import static io.github.jsonSnapshot.SnapshotMatcher.expect;
15+
import static io.github.jsonSnapshot.SnapshotMatcher.start;
16+
import static io.github.jsonSnapshot.SnapshotMatcher.validateSnapshots;
17+
18+
@RunWith(MockitoJUnitRunner.class)
19+
public class SnapshotUtilsTest {
20+
21+
@Mock
22+
private FakeObject fakeObject;
23+
24+
@BeforeClass
25+
public static void beforeAll() {
26+
start();
27+
}
28+
29+
@AfterClass
30+
public static void afterAll() {
31+
validateSnapshots();
32+
}
33+
34+
35+
@Test
36+
public void shouldExtractArgsFromMethod() throws NoSuchMethodException {
37+
38+
fakeObject.fakeMethod("test1", 1L, Arrays.asList("listTest1"));
39+
fakeObject.fakeMethod("test2", 2L, Arrays.asList("listTest1", "listTest2"));
40+
41+
HashMap<?, ?> fakeMethodArgs = SnapshotUtils.extractArgs(fakeObject, "fakeMethod", String.class, Long.class, List.class);
42+
expect(fakeMethodArgs).toMatchSnapshot();
43+
44+
}
45+
46+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
io.github.jsonSnapshot.SnapshotUtilsTest.shouldExtractArgsFromMethod=[
2+
{
3+
"FakeObject.fakeMethod": [
4+
{
5+
"arg0": "test1",
6+
"arg1": 1,
7+
"arg2": [
8+
"listTest1"
9+
]
10+
},
11+
{
12+
"arg0": "test2",
13+
"arg1": 2,
14+
"arg2": [
15+
"listTest1",
16+
"listTest2"
17+
]
18+
}
19+
]
20+
}
21+
]

0 commit comments

Comments
 (0)