Skip to content

Commit bcaf1a3

Browse files
committed
Improves Mockito error reporting
1 parent d9f9dc9 commit bcaf1a3

File tree

2 files changed

+16
-5
lines changed

2 files changed

+16
-5
lines changed

equalsverifier-core/src/main/java/nl/jqno/equalsverifier/internal/instantiation/MockitoValueProvider.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
package nl.jqno.equalsverifier.internal.instantiation;
22

3+
import static org.mockito.Mockito.doReturn;
34
import static org.mockito.Mockito.mock;
45
import static org.mockito.Mockito.withSettings;
56

67
import java.util.Optional;
78

89
import nl.jqno.equalsverifier.internal.exceptions.MockitoException;
9-
import nl.jqno.equalsverifier.internal.instantiation.Attributes;
1010
import nl.jqno.equalsverifier.internal.reflection.Tuple;
1111
import nl.jqno.equalsverifier.internal.reflection.TypeTag;
1212

@@ -45,8 +45,8 @@ public <T> Optional<Tuple<T>> provide(TypeTag tag, Attributes attributes) {
4545
}
4646

4747
try {
48-
var red = buildMock(type, attributes.fieldName());
49-
var blue = buildMock(type, attributes.fieldName());
48+
var red = buildMock(type, attributes.fieldName(), "red");
49+
var blue = buildMock(type, attributes.fieldName(), "blue");
5050
if (!red.equals(blue) && red.hashCode() != blue.hashCode()) {
5151
// Only return mocked values if they're properly unequal.
5252
// They should be, but I think this is undocumented behaviour, so best to be safe.
@@ -55,16 +55,19 @@ public <T> Optional<Tuple<T>> provide(TypeTag tag, Attributes attributes) {
5555
}
5656
catch (RuntimeException ignored) {
5757
// I would prefer to catch MockitoException, but that leads to class loading errors in modules that don't have Mockito
58+
ignored.printStackTrace();
5859
return Optional.empty();
5960
}
6061

6162
return Optional.empty();
6263
}
6364

64-
private <T> T buildMock(Class<T> type, String fieldName) {
65-
return mock(type, withSettings().defaultAnswer(invocation -> {
65+
private <T> T buildMock(Class<T> type, String fieldName, String color) {
66+
var m = mock(type, withSettings().defaultAnswer(invocation -> {
6667
// Throw an exception on any method except equals and hashCode
6768
throw new MockitoException(fieldName, type.getSimpleName(), invocation.getMethod().getName());
6869
}));
70+
doReturn("[" + color + " mock for " + type.getSimpleName() + "]").when(m).toString();
71+
return m;
6972
}
7073
}

equalsverifier-core/src/test/java/nl/jqno/equalsverifier/internal/instantiation/MockitoValueProviderTest.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,14 @@ void provideNothingWhenDisabled() {
7272
assertThat(actual).isEmpty();
7373
}
7474

75+
@Test
76+
void canCallToStringOnMock() {
77+
var tuple = sut.provide(new TypeTag(Point.class), Attributes.empty()).get();
78+
assertThat(tuple.red().toString()).isEqualTo("[red mock for Point]");
79+
assertThat(tuple.blue().toString()).isEqualTo("[blue mock for Point]");
80+
assertThat(tuple.redCopy().toString()).isEqualTo("[red mock for Point]");
81+
}
82+
7583
private void check(Class<?> type) {
7684
var tuple = sut.provide(new TypeTag(type), Attributes.named(SOME_FIELD_NAME)).get();
7785
assertThat(tuple.red()).isNotEqualTo(tuple.blue()).isEqualTo(tuple.redCopy());

0 commit comments

Comments
 (0)