From 1a8946f19cb8c677fe779f8acbda97e284f7d61f Mon Sep 17 00:00:00 2001 From: Rafael Winterhalter Date: Tue, 24 Aug 2021 16:05:40 +0200 Subject: [PATCH 1/4] Remove special handling for hashCode/equals as it breaks Mockito's internal model. --- .../bytebuddy/SubclassBytecodeGenerator.java | 21 +++++-------------- .../TypeCachingBytecodeGenerator.java | 12 +++-------- 2 files changed, 8 insertions(+), 25 deletions(-) diff --git a/src/main/java/org/mockito/internal/creation/bytebuddy/SubclassBytecodeGenerator.java b/src/main/java/org/mockito/internal/creation/bytebuddy/SubclassBytecodeGenerator.java index 46ecb7868a..f67fdfc5a6 100644 --- a/src/main/java/org/mockito/internal/creation/bytebuddy/SubclassBytecodeGenerator.java +++ b/src/main/java/org/mockito/internal/creation/bytebuddy/SubclassBytecodeGenerator.java @@ -44,7 +44,6 @@ import net.bytebuddy.implementation.Implementation; import net.bytebuddy.implementation.attribute.MethodAttributeAppender; import net.bytebuddy.matcher.ElementMatcher; -import org.mockito.Answers; import org.mockito.codegen.InjectionBase; import org.mockito.exceptions.base.MockitoException; import org.mockito.internal.creation.bytebuddy.ByteBuddyCrossClassLoaderSerializationSupport.CrossClassLoaderSerializableMock; @@ -241,21 +240,11 @@ public Class mockClass(MockFeatures features) { .serialVersionUid(42L) .defineField("mockitoInterceptor", MockMethodInterceptor.class, PRIVATE) .implement(MockAccess.class) - .intercept(FieldAccessor.ofBeanProperty()); - - if (features.defaultAnswer != Answers.CALLS_REAL_METHODS) { - builder = - builder.method(isHashCode()) - .intercept(hashCode) - .method(isEquals()) - .intercept(equals); - } else { - builder = - builder.method(isHashCode()) - .intercept(dispatcher) - .method(isEquals()) - .intercept(dispatcher); - } + .intercept(FieldAccessor.ofBeanProperty()) + .method(isHashCode()) + .intercept(hashCode) + .method(isEquals()) + .intercept(equals); if (features.serializableMode == SerializableMode.ACROSS_CLASSLOADERS) { builder = builder.implement(CrossClassLoaderSerializableMock.class) diff --git a/src/main/java/org/mockito/internal/creation/bytebuddy/TypeCachingBytecodeGenerator.java b/src/main/java/org/mockito/internal/creation/bytebuddy/TypeCachingBytecodeGenerator.java index 5ce57b1115..625d7b795f 100644 --- a/src/main/java/org/mockito/internal/creation/bytebuddy/TypeCachingBytecodeGenerator.java +++ b/src/main/java/org/mockito/internal/creation/bytebuddy/TypeCachingBytecodeGenerator.java @@ -45,8 +45,7 @@ public Class mockClass(final MockFeatures params) { params.mockedType, params.interfaces, params.serializableMode, - params.stripAnnotations, - params.defaultAnswer), + params.stripAnnotations), () -> bytecodeGenerator.mockClass(params), BOOTSTRAP_LOCK); } catch (IllegalArgumentException exception) { @@ -86,18 +85,15 @@ private static class MockitoMockKey extends TypeCache.SimpleKey { private final SerializableMode serializableMode; private final boolean stripAnnotations; - private final Answer defaultAnswer; private MockitoMockKey( Class type, Set> additionalType, SerializableMode serializableMode, - boolean stripAnnotations, - Answer defaultAnswer) { + boolean stripAnnotations) { super(type, additionalType); this.serializableMode = serializableMode; this.stripAnnotations = stripAnnotations; - this.defaultAnswer = defaultAnswer; } @Override @@ -113,8 +109,7 @@ public boolean equals(Object object) { } MockitoMockKey that = (MockitoMockKey) object; return stripAnnotations == that.stripAnnotations - && serializableMode.equals(that.serializableMode) - && Objects.equals(defaultAnswer, that.defaultAnswer); + && serializableMode.equals(that.serializableMode); } @Override @@ -122,7 +117,6 @@ public int hashCode() { int result = super.hashCode(); result = 31 * result + (stripAnnotations ? 1 : 0); result = 31 * result + serializableMode.hashCode(); - result = 31 * result + Objects.hashCode(defaultAnswer); return result; } } From c740965940431e5162600cde395574101ab1e383 Mon Sep 17 00:00:00 2001 From: Rafael Winterhalter Date: Tue, 24 Aug 2021 16:17:14 +0200 Subject: [PATCH 2/4] Allow for building without Android SDK. Remove warnings. --- settings.gradle.kts | 7 ++++++- .../creation/bytebuddy/TypeCachingBytecodeGenerator.java | 2 -- .../src/test/kotlin/org/mockito/kotlin/SuspendTest.kt | 2 +- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/settings.gradle.kts b/settings.gradle.kts index 0803799cdd..cdaa0e66e3 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -9,7 +9,6 @@ include("deprecatedPluginsTest", "kotlinTest", "kotlinReleaseCoroutinesTest", "android", - "androidTest", "junit-jupiter", "junitJupiterExtensionTest", "junitJupiterInlineMockMakerExtensionTest", @@ -19,6 +18,12 @@ include("deprecatedPluginsTest", "junitJupiterParallelTest", "osgi-test") +if (System.getenv("ANDROID_SDK_ROOT") != null || File(".local.properties").exists()) { + include("androidTest") +} else { + logger.info("Not including android test project due to missing SDK configuration") +} + rootProject.name = "mockito" val koltinBuildScriptProject = hashSetOf("junitJupiterExtensionTest", "junitJupiterInlineMockMakerExtensionTest") diff --git a/src/main/java/org/mockito/internal/creation/bytebuddy/TypeCachingBytecodeGenerator.java b/src/main/java/org/mockito/internal/creation/bytebuddy/TypeCachingBytecodeGenerator.java index 625d7b795f..30ed949bf5 100644 --- a/src/main/java/org/mockito/internal/creation/bytebuddy/TypeCachingBytecodeGenerator.java +++ b/src/main/java/org/mockito/internal/creation/bytebuddy/TypeCachingBytecodeGenerator.java @@ -5,14 +5,12 @@ package org.mockito.internal.creation.bytebuddy; import java.lang.ref.ReferenceQueue; -import java.util.Objects; import java.util.Set; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; import net.bytebuddy.TypeCache; import org.mockito.mock.SerializableMode; -import org.mockito.stubbing.Answer; class TypeCachingBytecodeGenerator extends ReferenceQueue implements BytecodeGenerator { diff --git a/subprojects/kotlinReleaseCoroutinesTest/src/test/kotlin/org/mockito/kotlin/SuspendTest.kt b/subprojects/kotlinReleaseCoroutinesTest/src/test/kotlin/org/mockito/kotlin/SuspendTest.kt index 85131ac6f8..d42a0c0006 100644 --- a/subprojects/kotlinReleaseCoroutinesTest/src/test/kotlin/org/mockito/kotlin/SuspendTest.kt +++ b/subprojects/kotlinReleaseCoroutinesTest/src/test/kotlin/org/mockito/kotlin/SuspendTest.kt @@ -5,8 +5,8 @@ package org.mockito.kotlin import kotlinx.coroutines.runBlocking +import org.hamcrest.MatcherAssert.assertThat import org.hamcrest.core.IsEqual -import org.junit.Assert.assertThat import org.junit.Test import org.mockito.Mockito.* From e1f98555ec904e8f8150cb24fa90392393cad9be Mon Sep 17 00:00:00 2001 From: Rafael Winterhalter Date: Tue, 24 Aug 2021 16:23:26 +0200 Subject: [PATCH 3/4] Fixes or removes tests that build on unfulfilled assumptions. --- .../TypeCachingMockBytecodeGeneratorTest.java | 6 +-- .../MockCreationShouldNotAffectSpyTest.java | 48 ------------------- .../SpyCreationShouldNotAffectMockTest.java | 48 ------------------- .../spies/SpyingOnRealObjectsTest.java | 10 ---- 4 files changed, 3 insertions(+), 109 deletions(-) delete mode 100644 src/test/java/org/mockitousage/spies/MockCreationShouldNotAffectSpyTest.java delete mode 100644 src/test/java/org/mockitousage/spies/SpyCreationShouldNotAffectMockTest.java diff --git a/src/test/java/org/mockito/internal/creation/bytebuddy/TypeCachingMockBytecodeGeneratorTest.java b/src/test/java/org/mockito/internal/creation/bytebuddy/TypeCachingMockBytecodeGeneratorTest.java index e26b36d531..026fba3bfb 100644 --- a/src/test/java/org/mockito/internal/creation/bytebuddy/TypeCachingMockBytecodeGeneratorTest.java +++ b/src/test/java/org/mockito/internal/creation/bytebuddy/TypeCachingMockBytecodeGeneratorTest.java @@ -145,7 +145,7 @@ public void ensure_cache_returns_different_instance_serializableMode() throws Ex } @Test - public void ensure_cache_returns_different_instance_defaultAnswer() throws Exception { + public void ensure_cache_returns_same_instance_defaultAnswer() throws Exception { // given ClassLoader classloader_with_life_shorter_than_cache = inMemoryClassLoader() @@ -174,10 +174,10 @@ public void ensure_cache_returns_different_instance_defaultAnswer() throws Excep SerializableMode.NONE, false, answer)); - assertThat(classes.add(klass)).isTrue(); + assertThat(classes.add(klass)).isFalse(); } - assertThat(classes).hasSize(answers.length + 1); + assertThat(classes).hasSize(1); } @Test diff --git a/src/test/java/org/mockitousage/spies/MockCreationShouldNotAffectSpyTest.java b/src/test/java/org/mockitousage/spies/MockCreationShouldNotAffectSpyTest.java deleted file mode 100644 index c77e589594..0000000000 --- a/src/test/java/org/mockitousage/spies/MockCreationShouldNotAffectSpyTest.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (c) 2007 Mockito contributors - * This program is made available under the terms of the MIT License. - */ -package org.mockitousage.spies; - -import org.junit.Test; -import org.mockitoutil.TestBase; - -import static org.junit.Assert.assertEquals; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.spy; - -public class MockCreationShouldNotAffectSpyTest extends TestBase { - - @Test - public void test() { - TestClass instance = new TestClass(42); - - TestClass mock = mock(TestClass.class); - assertEquals(mock.hashCode(), mock.hashCode()); - assertEquals(mock, mock); - - TestClass spy = spy(instance); - assertEquals(instance.hashCode(), spy.hashCode()); - assertEquals(spy, instance); - assertEquals(instance, spy); - } - - static class TestClass { - private final long value; - - TestClass(final long value) { - this.value = value; - } - - public boolean equals(final Object o) { - if (!(o instanceof TestClass)) { - return false; - } - return value == ((TestClass) o).value; - } - - public int hashCode() { - return Long.hashCode(value); - } - } -} diff --git a/src/test/java/org/mockitousage/spies/SpyCreationShouldNotAffectMockTest.java b/src/test/java/org/mockitousage/spies/SpyCreationShouldNotAffectMockTest.java deleted file mode 100644 index a57ec082c1..0000000000 --- a/src/test/java/org/mockitousage/spies/SpyCreationShouldNotAffectMockTest.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (c) 2007 Mockito contributors - * This program is made available under the terms of the MIT License. - */ -package org.mockitousage.spies; - -import org.junit.Test; -import org.mockitoutil.TestBase; - -import static org.junit.Assert.assertEquals; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.spy; - -public class SpyCreationShouldNotAffectMockTest extends TestBase { - - @Test - public void test() { - TestClass instance = new TestClass(Long.MIN_VALUE); - - TestClass spy = spy(instance); - assertEquals(instance.hashCode(), spy.hashCode()); - assertEquals(spy, instance); - assertEquals(instance, spy); - - TestClass mock = mock(TestClass.class); - assertEquals(mock.hashCode(), mock.hashCode()); - assertEquals(mock, mock); - } - - static class TestClass { - private final long value; - - TestClass(final long value) { - this.value = value; - } - - public boolean equals(final Object o) { - if (!(o instanceof TestClass)) { - return false; - } - return value == ((TestClass) o).value; - } - - public int hashCode() { - return Long.hashCode(value); - } - } -} diff --git a/src/test/java/org/mockitousage/spies/SpyingOnRealObjectsTest.java b/src/test/java/org/mockitousage/spies/SpyingOnRealObjectsTest.java index 06b4878fa3..a3ed58cfd4 100644 --- a/src/test/java/org/mockitousage/spies/SpyingOnRealObjectsTest.java +++ b/src/test/java/org/mockitousage/spies/SpyingOnRealObjectsTest.java @@ -9,7 +9,6 @@ import static org.junit.Assume.assumeTrue; import static org.mockito.Mockito.*; -import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedList; import java.util.List; @@ -193,13 +192,4 @@ public void shouldSayNiceMessageWhenSpyingOnPrivateClass() throws Exception { "Most likely it is due to mocking a private class that is not visible to Mockito"); } } - - @Test - public void spysHashCodeEqualsDelegatedToActualMethods() { - List real = new ArrayList<>(); - real.add("one"); - List spy = spy(real); - assertEquals(real.hashCode(), spy.hashCode()); - assertTrue(spy.equals(real)); - } } From 3ed0655d99ab38bdb80233550139b4113776dc91 Mon Sep 17 00:00:00 2001 From: Rafael Winterhalter Date: Tue, 24 Aug 2021 16:26:07 +0200 Subject: [PATCH 4/4] Remove deprecation warning --- .../java/org/mockitousage/spies/SpyingOnRealObjectsTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/org/mockitousage/spies/SpyingOnRealObjectsTest.java b/src/test/java/org/mockitousage/spies/SpyingOnRealObjectsTest.java index a3ed58cfd4..30d3784582 100644 --- a/src/test/java/org/mockitousage/spies/SpyingOnRealObjectsTest.java +++ b/src/test/java/org/mockitousage/spies/SpyingOnRealObjectsTest.java @@ -59,7 +59,7 @@ public void shouldStub() { @Test public void shouldAllowOverridingStubs() { - when(spy.contains(anyObject())).thenReturn(true); + when(spy.contains(any())).thenReturn(true); when(spy.contains("foo")).thenReturn(false); assertTrue(spy.contains("bar"));