diff --git a/mockito-tutorial/app/src/test/java/quality/software/X2_SortNumOfComparisons.java b/mockito-tutorial/app/src/test/java/quality/software/X2_SortNumOfComparisons.java deleted file mode 100644 index 9d786fa0..00000000 --- a/mockito-tutorial/app/src/test/java/quality/software/X2_SortNumOfComparisons.java +++ /dev/null @@ -1,40 +0,0 @@ -package quality.software; - -import org.junit.jupiter.api.Test; - -import java.util.Arrays; -import java.util.Comparator; - -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.*; - -public class X2_SortNumOfComparisons { - Integer[] array = {3, 2, 1}; - - @Test - public void mockingNotIdealHere() { - // Create a mocked Comparator. - // - Forward calls of Comparator.compare() to an actual comparator. - // - Record how many times compare() is called. - Comparator comparator = mock(Comparator.class); - when(comparator.compare(any(Integer.class), any(Integer.class))) - .thenAnswer(invocation -> - NaturalOrder.INSTANCE.compare( - invocation.getArgument(0, Integer.class), - invocation.getArgument(1, Integer.class))); - - - Arrays.sort(array, comparator); - - verify(comparator, times(2)).compare(any(Integer.class), any(Integer.class)); - } - - @Test - public void useSpyInstead(){ - Comparator comparator = spy(NaturalOrder.INSTANCE); - - Arrays.sort(array, comparator); - - verify(comparator, times(2)).compare(any(), any()); - } -} diff --git a/mockito-tutorial/app/src/test/java/quality/software/X2_Sort_Comparisons.java b/mockito-tutorial/app/src/test/java/quality/software/X2_Sort_Comparisons.java new file mode 100644 index 00000000..77581994 --- /dev/null +++ b/mockito-tutorial/app/src/test/java/quality/software/X2_Sort_Comparisons.java @@ -0,0 +1,93 @@ +package quality.software; + +import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; + +import java.util.Arrays; +import java.util.Comparator; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.*; + +public class X2_Sort_Comparisons { + Integer[] array = {3, 2, 1}; + + @Test + public void mockingNotIdealHere() { + // Create a mocked Comparator. + // - Forward calls of `Comparator.compare()` to an actual comparator. + // - Record how many times `compare()` is called. + Comparator comparator = mock(Comparator.class); + when(comparator.compare(any(Integer.class), any(Integer.class))) + .thenAnswer(invocation -> + NaturalOrder.INSTANCE.compare( + invocation.getArgument(0, Integer.class), + invocation.getArgument(1, Integer.class))); + + + Arrays.sort(array, comparator); + + // Verify that `compare()` was called two times. + verify(comparator, times(2)).compare(any(Integer.class), any(Integer.class)); + // Verify that nothing else was called. + verifyNoMoreInteractions(comparator); + } + + @Test + public void useSpyInstead() { + // Create a spied Comparator. + // - Record how many times `compare()` is called. + Comparator comparator = spy(NaturalOrder.INSTANCE); + + Arrays.sort(array, comparator); + + // Verify that `compare()` was called two times. + verify(comparator, times(2)).compare(any(Integer.class), any(Integer.class)); + // Verify that nothing else was called. + verifyNoMoreInteractions(comparator); + } + + @Test + public void verifyArguments() { + Comparator comparator = spy(NaturalOrder.INSTANCE); + + Arrays.sort(array, comparator); + + // Verify that one `compare()` call was with arguments (`1`, `2`) + // and that the other one was with (`2`, `3`). + // -> We don't check the ordering of the `compare()` calls here! + verify(comparator, times(1)).compare(1, 2); + verify(comparator, times(1)).compare(2, 3); + // Verify that nothing else was called. + verifyNoMoreInteractions(comparator); + } + + @Test + public void verifyArgumentsAndTheirOrder() { + Comparator comparator = spy(NaturalOrder.INSTANCE); + + Arrays.sort(array, comparator); + + ArgumentCaptor argCaptor1 = ArgumentCaptor.forClass(Integer.class); + ArgumentCaptor argCaptor2 = ArgumentCaptor.forClass(Integer.class); + // Verify that `compare()` was called two times. + verify(comparator, times(2)).compare(argCaptor1.capture(), argCaptor2.capture()); + // Verify that nothing else was called. + verifyNoMoreInteractions(comparator); + + List args1 = argCaptor1.getAllValues(); + List args2 = argCaptor2.getAllValues(); + + // Now the ordering of the two `compare()` calls matters! + + // Verify the arguments passed in the first `compare()` call. + assertEquals(2, args1.getFirst()); + assertEquals(3, args2.getFirst()); + + // Verify the arguments passed in the second `compare()` call. + assertEquals(1, args1.get(1)); + assertEquals(2, args2.get(1)); + } +}