Skip to content

Commit 49408cb

Browse files
authored
Merge pull request #413 from metafacture/339-metamorphVerifyNoMoreInteractionsPart2
Metamorph tests verify that no unexpected interactions occurred (second and final batch).
2 parents 3a5e499 + def3c60 commit 49408cb

27 files changed

+3612
-3718
lines changed

metamorph/src/test/java/org/metafacture/metamorph/MetamorphTest.java

Lines changed: 73 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -19,25 +19,24 @@
1919

2020
import static org.junit.Assert.assertEquals;
2121
import static org.junit.Assert.assertNotNull;
22-
import static org.mockito.ArgumentMatchers.any;
23-
import static org.mockito.ArgumentMatchers.anyInt;
24-
import static org.mockito.ArgumentMatchers.eq;
25-
import static org.mockito.Mockito.never;
26-
import static org.mockito.Mockito.verify;
27-
28-
import java.util.HashMap;
29-
import java.util.Map;
3022

3123
import org.junit.Before;
3224
import org.junit.Rule;
3325
import org.junit.Test;
3426
import org.metafacture.framework.helpers.DefaultStreamReceiver;
3527
import org.metafacture.metamorph.api.Maps;
3628
import org.metafacture.metamorph.api.NamedValueReceiver;
29+
import org.mockito.ArgumentMatchers;
3730
import org.mockito.Mock;
31+
import org.mockito.Mockito;
32+
import org.mockito.exceptions.base.MockitoAssertionError;
3833
import org.mockito.junit.MockitoJUnit;
3934
import org.mockito.junit.MockitoRule;
4035

36+
import java.util.HashMap;
37+
import java.util.Map;
38+
import java.util.function.Consumer;
39+
4140
/**
4241
* Tests for class {@link Metamorph}.
4342
*
@@ -50,7 +49,7 @@ public final class MetamorphTest {
5049
public MockitoRule mockitoRule = MockitoJUnit.rule();
5150

5251
@Mock
53-
private NamedValueReceiver namedValueReceiver;
52+
private NamedValueReceiver receiver;
5453

5554
private Metamorph metamorph;
5655

@@ -62,81 +61,64 @@ public void createSystemUnderTest() {
6261

6362
@Test
6463
public void shouldMapMatchingPath() {
65-
setupSimpleMappingMorph();
66-
67-
metamorph.startRecord("");
68-
metamorph.literal("testEntity.testLiteral", "testValue");
69-
70-
verify(namedValueReceiver).receive(eq("outName"), eq("testValue"),
71-
any(), anyInt(), anyInt());
64+
assertNamedValue(true, i -> {
65+
i.literal("testEntity.testLiteral", "testValue");
66+
});
7267
}
7368

7469
@Test
7570
public void shouldNotMapNonMatchingPath() {
76-
setupSimpleMappingMorph();
77-
78-
metamorph.startRecord("");
79-
metamorph.literal("nonMatching.path", "testValue");
80-
81-
verify(namedValueReceiver, never()).receive(any(), any(), any(), anyInt(),
82-
anyInt());
71+
assertNamedValue(false, i -> {
72+
i.literal("nonMatching.path", "testValue");
73+
});
8374
}
8475

8576
@Test
8677
public void shouldMapMatchingLiteralInMatchingEntity() {
87-
setupSimpleMappingMorph();
88-
89-
metamorph.startRecord("");
90-
metamorph.startEntity("testEntity");
91-
metamorph.literal("testLiteral", "testValue");
92-
93-
verify(namedValueReceiver).receive(eq("outName"), eq("testValue"),
94-
any(), anyInt(), anyInt());
78+
assertNamedValue(true, i -> {
79+
i.startEntity("testEntity");
80+
i.literal("testLiteral", "testValue");
81+
});
9582
}
9683

9784
@Test
9885
public void shouldNotMapNonMatchingLiteralInMatchingEntity() {
99-
setupSimpleMappingMorph();
100-
101-
metamorph.startRecord("");
102-
metamorph.startEntity("testEntity");
103-
metamorph.literal("nonMatching", "testValue");
104-
105-
verify(namedValueReceiver, never()).receive(any(), any(), any(), anyInt(),
106-
anyInt());
86+
assertNamedValue(false, i -> {
87+
i.startEntity("testEntity");
88+
i.literal("nonMatching", "testValue");
89+
});
10790
}
10891

10992
@Test
11093
public void shouldNotMapMatchingLiteralInNonMatchingEntity() {
111-
setupSimpleMappingMorph();
112-
113-
metamorph.startRecord("");
114-
metamorph.startEntity("nonMatching");
115-
metamorph.literal("testLiteral", "testValue");
116-
117-
verify(namedValueReceiver, never()).receive(any(), any(), any(), anyInt(),
118-
anyInt());
94+
assertNamedValue(false, i -> {
95+
i.startEntity("nonMatching");
96+
i.literal("testLiteral", "testValue");
97+
});
11998
}
12099
@Test
121100
public void shouldNotMapLiteralWithoutMatchingEntity() {
122-
setupSimpleMappingMorph();
123-
124-
metamorph.startRecord("");
125-
metamorph.literal("testLiteral", "testValue");
126-
127-
verify(namedValueReceiver, never()).receive(any(), any(), any(), anyInt(),
128-
anyInt());
101+
assertNamedValue(false, i -> {
102+
i.literal("testLiteral", "testValue");
103+
});
129104
}
130105

131-
/**
132-
* Creates the Metamorph structure that corresponds to the Metamorph XML
133-
* statement {@code <data source="testEntity.testLiteral" name="outName" />}.
134-
*/
135-
private void setupSimpleMappingMorph() {
136-
final Data data = new Data();
137-
data.setName("outName");
138-
data.setNamedValueReceiver(namedValueReceiver);
139-
metamorph.registerNamedValueReceiver("testEntity" + '.' + "testLiteral", data);
106+
@Test
107+
public void shouldFedbackLiteralsStartingWithAtIntoMetamorph() {
108+
assertNamedValue(true, i -> {
109+
final Data data1;
110+
data1 = new Data();
111+
data1.setName("@feedback");
112+
i.addNamedValueSource(data1);
113+
i.registerNamedValueReceiver("testLiteral", data1);
114+
115+
final Data data2 = new Data();
116+
data2.setName("outName");
117+
data2.setNamedValueReceiver(receiver);
118+
i.registerNamedValueReceiver("@feedback", data2);
119+
120+
i.literal("testLiteral", "testValue");
121+
});
140122
}
141123

142124
@Test
@@ -160,26 +142,6 @@ public void shouldReturnDefaultValueIfMapIsKnownButNameIsUnknown() {
160142
assertEquals("defaultValue", metamorph.getValue("testMap", "nameNotInMap"));
161143
}
162144

163-
@Test
164-
public void shouldFedbackLiteralsStartingWithAtIntoMetamorph() {
165-
final Data data1;
166-
data1 = new Data();
167-
data1.setName("@feedback");
168-
metamorph.addNamedValueSource(data1);
169-
metamorph.registerNamedValueReceiver("testLiteral", data1);
170-
171-
final Data data2 = new Data();
172-
data2.setName("outName");
173-
data2.setNamedValueReceiver(namedValueReceiver);
174-
metamorph.registerNamedValueReceiver("@feedback", data2);
175-
176-
metamorph.startRecord("");
177-
metamorph.literal("testLiteral", "testValue");
178-
179-
verify(namedValueReceiver).receive(eq("outName"), eq("testValue"),
180-
any(), anyInt(), anyInt());
181-
}
182-
183145
@Test(expected=IllegalStateException.class)
184146
public void shouldThrowIllegalStateExceptionIfEntityIsNotClosed() {
185147
metamorph.startRecord("");
@@ -189,4 +151,32 @@ public void shouldThrowIllegalStateExceptionIfEntityIsNotClosed() {
189151
metamorph.endRecord(); // Exception expected
190152
}
191153

154+
private void assertNamedValue(final boolean matching, final Consumer<Metamorph> in) {
155+
/**
156+
* Creates the Metamorph structure that corresponds to the Metamorph XML
157+
* statement {@code <data source="testEntity.testLiteral" name="outName" />}.
158+
*/
159+
final Data data = new Data();
160+
data.setName("outName");
161+
data.setNamedValueReceiver(receiver);
162+
metamorph.registerNamedValueReceiver("testEntity" + '.' + "testLiteral", data);
163+
164+
metamorph.startRecord("");
165+
in.accept(metamorph);
166+
167+
try {
168+
if (matching) {
169+
Mockito.verify(receiver).receive(
170+
ArgumentMatchers.eq("outName"), ArgumentMatchers.eq("testValue"),
171+
ArgumentMatchers.any(), ArgumentMatchers.eq(1), ArgumentMatchers.anyInt());
172+
}
173+
174+
Mockito.verifyNoMoreInteractions(receiver);
175+
}
176+
catch (final MockitoAssertionError e) {
177+
System.out.println(Mockito.mockingDetails(receiver).printInvocations());
178+
throw e;
179+
}
180+
}
181+
192182
}

metamorph/src/test/java/org/metafacture/metamorph/SplitterTest.java

Lines changed: 83 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,19 @@
1616

1717
package org.metafacture.metamorph;
1818

19-
import static org.mockito.Mockito.inOrder;
20-
import static org.mockito.Mockito.verify;
21-
import static org.mockito.Mockito.verifyZeroInteractions;
22-
23-
import org.junit.Before;
19+
import org.junit.Rule;
2420
import org.junit.Test;
2521
import org.metafacture.framework.StreamReceiver;
2622
import org.mockito.InOrder;
2723
import org.mockito.Mock;
28-
import org.mockito.MockitoAnnotations;
24+
import org.mockito.Mockito;
25+
import org.mockito.exceptions.base.MockitoAssertionError;
26+
import org.mockito.junit.MockitoJUnit;
27+
import org.mockito.junit.MockitoRule;
28+
29+
import java.util.function.BiConsumer;
30+
import java.util.function.Consumer;
31+
import java.util.function.Supplier;
2932

3033
/**
3134
* Tests for class {@link Splitter}.
@@ -36,68 +39,101 @@
3639
*/
3740
public final class SplitterTest {
3841

42+
@Rule
43+
public MockitoRule mockito = MockitoJUnit.rule();
44+
3945
@Mock
4046
private StreamReceiver receiver1;
4147

4248
@Mock
4349
private StreamReceiver receiver2;
4450

45-
private Splitter splitter;
46-
47-
@Before
48-
public void setup() {
49-
MockitoAnnotations.initMocks(this);
50-
splitter = new Splitter("org/metafacture/metamorph/splitter-test.xml");
51-
splitter.setReceiver("receiver-1", receiver1);
52-
splitter.setReceiver("receiver-2", receiver2);
53-
}
54-
5551
@Test
5652
public void shouldPassRecordToReceiverWithMatchingKey() {
57-
splitter.startRecord("1");
58-
splitter.startEntity("data");
59-
splitter.literal("forward-to", "receiver-1");
60-
splitter.endEntity();
61-
splitter.endRecord();
62-
splitter.startRecord("2");
63-
splitter.literal("forward-to", "receiver-2");
64-
splitter.endRecord();
65-
66-
final InOrder ordered = inOrder(receiver1, receiver2);
67-
ordered.verify(receiver1).startRecord("1");
68-
ordered.verify(receiver1).startEntity("data");
69-
ordered.verify(receiver1).literal("forward-to", "receiver-1");
70-
ordered.verify(receiver1).endEntity();
71-
ordered.verify(receiver1).endRecord();
72-
ordered.verify(receiver2).startRecord("2");
73-
ordered.verify(receiver2).literal("forward-to", "receiver-2");
74-
ordered.verify(receiver2).endRecord();
75-
ordered.verifyNoMoreInteractions();
53+
assertSplitter(
54+
i -> {
55+
i.startRecord("1");
56+
i.startEntity("data");
57+
i.literal("forward-to", "receiver-1");
58+
i.endEntity();
59+
i.endRecord();
60+
i.startRecord("2");
61+
i.literal("forward-to", "receiver-2");
62+
i.endRecord();
63+
},
64+
(o1, o2) -> {
65+
o1.get().startRecord("1");
66+
o1.get().startEntity("data");
67+
o1.get().literal("forward-to", "receiver-1");
68+
o1.get().endEntity();
69+
o1.get().endRecord();
70+
o2.get().startRecord("2");
71+
o2.get().literal("forward-to", "receiver-2");
72+
o2.get().endRecord();
73+
}
74+
);
7675
}
7776

7877
@Test
7978
public void shouldDiscardNonMatchingRecords() {
80-
splitter.startRecord("1");
81-
splitter.literal("forward-to", "none");
82-
splitter.endRecord();
83-
84-
verifyZeroInteractions(receiver1, receiver2);
79+
assertSplitter(
80+
i -> {
81+
i.startRecord("1");
82+
i.literal("forward-to", "none");
83+
i.endRecord();
84+
},
85+
(o1, o2) -> {
86+
}
87+
);
8588
}
8689

8790
@Test
8891
public void shouldPassResetStreamToAllReceivers() {
89-
splitter.resetStream();
90-
91-
verify(receiver1).resetStream();
92-
verify(receiver2).resetStream();
92+
assertSplitter(
93+
i -> {
94+
i.resetStream();
95+
},
96+
(o1, o2) -> {
97+
o1.get().resetStream();
98+
o2.get().resetStream();
99+
}
100+
);
93101
}
94102

95103
@Test
96104
public void shouldPassCloseStreamToAllReceivers() {
97-
splitter.closeStream();
105+
assertSplitter(
106+
i -> {
107+
i.closeStream();
108+
},
109+
(o1, o2) -> {
110+
o1.get().closeStream();
111+
o2.get().closeStream();
112+
}
113+
);
114+
}
115+
116+
private void assertSplitter(final Consumer<Splitter> in, final BiConsumer<Supplier<StreamReceiver>, Supplier<StreamReceiver>> out) {
117+
final InOrder ordered = Mockito.inOrder(receiver1, receiver2);
118+
119+
final Splitter splitter = new Splitter("org/metafacture/metamorph/splitter-test.xml");
120+
splitter.setReceiver("receiver-1", receiver1);
121+
splitter.setReceiver("receiver-2", receiver2);
122+
123+
in.accept(splitter);
124+
125+
try {
126+
out.accept(() -> ordered.verify(receiver1), () -> ordered.verify(receiver2));
98127

99-
verify(receiver1).closeStream();
100-
verify(receiver2).closeStream();
128+
ordered.verifyNoMoreInteractions();
129+
Mockito.verifyNoMoreInteractions(receiver1);
130+
Mockito.verifyNoMoreInteractions(receiver2);
131+
}
132+
catch (final MockitoAssertionError e) {
133+
System.out.println(Mockito.mockingDetails(receiver1).printInvocations());
134+
System.out.println(Mockito.mockingDetails(receiver2).printInvocations());
135+
throw e;
136+
}
101137
}
102138

103139
}

0 commit comments

Comments
 (0)