From 48197442a82e00c83ee50369c139990b7b62c687 Mon Sep 17 00:00:00 2001 From: Daniel Langbein Date: Thu, 16 Jan 2025 09:19:28 +0100 Subject: [PATCH] 2: SortNumOfComparisons --- .../java/quality/software/NaturalOrder.java | 15 +++++++ .../software/X2_SortNumOfComparisons.java | 40 +++++++++++++++++++ 2 files changed, 55 insertions(+) create mode 100644 mockito-tutorial/app/src/main/java/quality/software/NaturalOrder.java create mode 100644 mockito-tutorial/app/src/test/java/quality/software/X2_SortNumOfComparisons.java diff --git a/mockito-tutorial/app/src/main/java/quality/software/NaturalOrder.java b/mockito-tutorial/app/src/main/java/quality/software/NaturalOrder.java new file mode 100644 index 00000000..7d64b6ab --- /dev/null +++ b/mockito-tutorial/app/src/main/java/quality/software/NaturalOrder.java @@ -0,0 +1,15 @@ +package quality.software; + +import java.util.Comparator; + +/** + * Copied from JDK23 Arrays.java + */ +public final class NaturalOrder implements Comparator { + @SuppressWarnings("unchecked") + public int compare(Object first, Object second) { + return ((Comparable) first).compareTo(second); + } + + public static final NaturalOrder INSTANCE = new NaturalOrder(); +} 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 new file mode 100644 index 00000000..9d786fa0 --- /dev/null +++ b/mockito-tutorial/app/src/test/java/quality/software/X2_SortNumOfComparisons.java @@ -0,0 +1,40 @@ +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()); + } +}