diff --git a/settings.gradle.kts b/settings.gradle.kts index 5806de0315..d4751d4fd0 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -3,11 +3,9 @@ plugins { } include("subclass", - "inline", "proxy", "extTest", "groovyTest", - "groovyInlineTest", "kotlinTest", "kotlinReleaseCoroutinesTest", "android", diff --git a/subprojects/androidTest/androidTest.gradle b/subprojects/androidTest/androidTest.gradle index 941a52b9cc..072c222639 100644 --- a/subprojects/androidTest/androidTest.gradle +++ b/subprojects/androidTest/androidTest.gradle @@ -38,7 +38,7 @@ apply from: "$rootDir/gradle/dependencies.gradle" dependencies { implementation libraries.kotlin.stdlib - testImplementation project(":inline") + testImplementation project(":") testImplementation libraries.junit4 testImplementation libraries.junitJupiterApi testImplementation libraries.junitJupiterEngine diff --git a/subprojects/groovyInlineTest/groovyInlineTest.gradle b/subprojects/groovyInlineTest/groovyInlineTest.gradle deleted file mode 100644 index 1618ac6009..0000000000 --- a/subprojects/groovyInlineTest/groovyInlineTest.gradle +++ /dev/null @@ -1,11 +0,0 @@ -apply plugin: 'groovy' - -description = "Integration test for using mockito-inline with Groovy." - -apply from: "$rootDir/gradle/dependencies.gradle" - -dependencies { - testImplementation project(":inline") - testImplementation libraries.groovy - testImplementation libraries.junit4 -} diff --git a/subprojects/groovyInlineTest/src/test/groovy/org/mockito/groovy/GroovyMockitoTest.groovy b/subprojects/groovyInlineTest/src/test/groovy/org/mockito/groovy/GroovyMockitoTest.groovy deleted file mode 100644 index c327d0e1bb..0000000000 --- a/subprojects/groovyInlineTest/src/test/groovy/org/mockito/groovy/GroovyMockitoTest.groovy +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (c) 2022 Mockito contributors - * This program is made available under the terms of the MIT License. - */ -package org.mockito.groovy - -import org.junit.Test -import org.junit.runner.RunWith -import org.mockito.InjectMocks -import org.mockito.Mock -import org.mockito.junit.MockitoJUnitRunner - -import static org.mockito.Mockito.verify - -@RunWith(MockitoJUnitRunner) -class GroovyMockitoTest { - - @Mock Helper helper - @InjectMocks ClassUnderTest classUnderTest - - /** - * Test that the Groovy class under test can call methods on a mocked Groovy - * helper class. - */ - @Test - void testCallGroovyFromGroovy() { - classUnderTest.methodUnderTest() - verify(helper).helperMethod() - } - - static class ClassUnderTest { - private final Helper helper - - ClassUnderTest(Helper helper) { - this.helper = helper - } - - void methodUnderTest() { - helper.helperMethod() - } - } - - static class Helper { - void helperMethod() { } - } -} diff --git a/subprojects/inline/inline.gradle b/subprojects/inline/inline.gradle deleted file mode 100644 index ef421f0c02..0000000000 --- a/subprojects/inline/inline.gradle +++ /dev/null @@ -1,19 +0,0 @@ -description = "Mockito preconfigured inline mock maker (intermediate and to be superseeded by automatic usage in a future version)" - -apply from: "$rootDir/gradle/java-library.gradle" - -dependencies { - api project.rootProject - testImplementation libraries.junit4 - testImplementation libraries.assertj -} - -tasks.javadoc.enabled = false - -//required by the "StressTest.java" and "OneLinerStubStressTest.java" -test.maxHeapSize = "256m" -retryTest.maxHeapSize = "256m" - -test { - jvmArgs '--illegal-access=deny' -} diff --git a/subprojects/inline/src/main/resources/mockito-extensions/org.mockito.plugins.MemberAccessor b/subprojects/inline/src/main/resources/mockito-extensions/org.mockito.plugins.MemberAccessor deleted file mode 100644 index 1422f9900b..0000000000 --- a/subprojects/inline/src/main/resources/mockito-extensions/org.mockito.plugins.MemberAccessor +++ /dev/null @@ -1 +0,0 @@ -member-accessor-module diff --git a/subprojects/inline/src/main/resources/mockito-extensions/org.mockito.plugins.MockMaker b/subprojects/inline/src/main/resources/mockito-extensions/org.mockito.plugins.MockMaker deleted file mode 100644 index ca6ee9cea8..0000000000 --- a/subprojects/inline/src/main/resources/mockito-extensions/org.mockito.plugins.MockMaker +++ /dev/null @@ -1 +0,0 @@ -mock-maker-inline \ No newline at end of file diff --git a/subprojects/inline/src/test/java/org/mockitoinline/ConstructionMockRuleTest.java b/subprojects/inline/src/test/java/org/mockitoinline/ConstructionMockRuleTest.java deleted file mode 100644 index e53202eb33..0000000000 --- a/subprojects/inline/src/test/java/org/mockitoinline/ConstructionMockRuleTest.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (c) 2020 Mockito contributors - * This program is made available under the terms of the MIT License. - */ -package org.mockitoinline; - -import org.junit.Rule; -import org.junit.Test; -import org.mockito.Mock; -import org.mockito.MockedConstruction; -import org.mockito.junit.MockitoJUnit; -import org.mockito.junit.MockitoRule; - -import static junit.framework.TestCase.*; - -public final class ConstructionMockRuleTest { - - @Rule - public MockitoRule mockitoRule = MockitoJUnit.rule(); - - @Mock - private MockedConstruction dummy; - - @Test - public void testConstructionMockSimple() { - assertNull(new Dummy().foo()); - } - - @Test - public void testConstructionMockCollection() { - assertEquals(0, dummy.constructed().size()); - Dummy mock = new Dummy(); - assertEquals(1, dummy.constructed().size()); - assertTrue(dummy.constructed().contains(mock)); - } - - static class Dummy { - - String foo() { - return "foo"; - } - } -} diff --git a/subprojects/inline/src/test/java/org/mockitoinline/ConstructionMockTest.java b/subprojects/inline/src/test/java/org/mockitoinline/ConstructionMockTest.java deleted file mode 100644 index adbe3fe3ee..0000000000 --- a/subprojects/inline/src/test/java/org/mockitoinline/ConstructionMockTest.java +++ /dev/null @@ -1,187 +0,0 @@ -/* - * Copyright (c) 2020 Mockito contributors - * This program is made available under the terms of the MIT License. - */ -package org.mockitoinline; - -import static junit.framework.TestCase.assertEquals; -import static junit.framework.TestCase.assertNull; -import static junit.framework.TestCase.assertTrue; -import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; -import static org.mockito.Mockito.withSettings; - -import java.util.Collections; -import java.util.concurrent.atomic.AtomicReference; - -import org.junit.Test; -import org.mockito.MockMakers; -import org.mockito.MockedConstruction; -import org.mockito.Mockito; -import org.mockito.exceptions.base.MockitoException; - -public final class ConstructionMockTest { - - @Test - public void testConstructionMockSimple() { - assertEquals("foo", new Dummy().foo()); - try (MockedConstruction ignored = Mockito.mockConstruction(Dummy.class)) { - assertNull(new Dummy().foo()); - } - assertEquals("foo", new Dummy().foo()); - } - - @Test - public void testConstructionMockCollection() { - try (MockedConstruction dummy = Mockito.mockConstruction(Dummy.class)) { - assertEquals(0, dummy.constructed().size()); - Dummy mock = new Dummy(); - assertEquals(1, dummy.constructed().size()); - assertTrue(dummy.constructed().contains(mock)); - } - } - - @Test - public void testConstructionMockDefaultAnswer() { - try (MockedConstruction ignored = Mockito.mockConstructionWithAnswer(Dummy.class, invocation -> "bar")) { - assertEquals("bar", new Dummy().foo()); - } - } - - @Test - public void testConstructionMockDefaultAnswerMultiple() { - try (MockedConstruction ignored = Mockito.mockConstructionWithAnswer(Dummy.class, invocation -> "bar", invocation -> "qux")) { - assertEquals("bar", new Dummy().foo()); - assertEquals("qux", new Dummy().foo()); - assertEquals("qux", new Dummy().foo()); - } - } - - /** - * Tests issue #2544 - */ - @Test - public void testConstructionMockDefaultAnswerMultipleMoreThanTwo() { - try (MockedConstruction ignored = Mockito.mockConstructionWithAnswer(Dummy.class, invocation -> "bar", invocation -> "qux", invocation -> "baz")) { - assertEquals("bar", new Dummy().foo()); - assertEquals("qux", new Dummy().foo()); - assertEquals("baz", new Dummy().foo()); - assertEquals("baz", new Dummy().foo()); - } - } - - @Test - public void testConstructionMockPrepared() { - try (MockedConstruction ignored = Mockito.mockConstruction(Dummy.class, (mock, context) -> when(mock.foo()).thenReturn("bar"))) { - assertEquals("bar", new Dummy().foo()); - } - } - - - @Test - public void testConstructionMockContext() { - try (MockedConstruction ignored = Mockito.mockConstruction(Dummy.class, (mock, context) -> { - assertEquals(1, context.getCount()); - assertEquals(Collections.singletonList("foobar"), context.arguments()); - assertEquals(mock.getClass().getDeclaredConstructor(String.class), context.constructor()); - when(mock.foo()).thenReturn("bar"); - })) { - assertEquals("bar", new Dummy("foobar").foo()); - } - } - - @Test - public void testConstructionMockDoesNotAffectDifferentThread() throws InterruptedException { - try (MockedConstruction ignored = Mockito.mockConstruction(Dummy.class)) { - Dummy dummy = new Dummy(); - when(dummy.foo()).thenReturn("bar"); - assertEquals("bar", dummy.foo()); - verify(dummy).foo(); - AtomicReference reference = new AtomicReference<>(); - Thread thread = new Thread(() -> reference.set(new Dummy().foo())); - thread.start(); - thread.join(); - assertEquals("foo", reference.get()); - when(dummy.foo()).thenReturn("bar"); - assertEquals("bar", dummy.foo()); - verify(dummy, times(2)).foo(); - } - } - - @Test - public void testConstructionMockCanCoexistWithMockInDifferentThread() throws InterruptedException { - try (MockedConstruction ignored = Mockito.mockConstruction(Dummy.class)) { - Dummy dummy = new Dummy(); - when(dummy.foo()).thenReturn("bar"); - assertEquals("bar", dummy.foo()); - verify(dummy).foo(); - AtomicReference reference = new AtomicReference<>(); - Thread thread = new Thread(() -> { - try (MockedConstruction ignored2 = Mockito.mockConstruction(Dummy.class)) { - Dummy other = new Dummy(); - when(other.foo()).thenReturn("qux"); - reference.set(other.foo()); - } - }); - thread.start(); - thread.join(); - assertEquals("qux", reference.get()); - assertEquals("bar", dummy.foo()); - verify(dummy, times(2)).foo(); - } - } - - @Test - public void testConstructionMockMustBeExclusiveInScopeWithinThread() { - assertThatThrownBy( - () -> { - try ( - MockedConstruction dummy = Mockito.mockConstruction(Dummy.class); - MockedConstruction duplicate = Mockito.mockConstruction(Dummy.class)) { - } - }) - .isInstanceOf(MockitoException.class) - .hasMessageContaining("static mocking is already registered in the current thread"); - } - - @Test - public void testConstructionMockMustNotTargetAbstractClass() { - assertThatThrownBy( - () -> { - Mockito.mockConstruction(Runnable.class).close(); - }) - .isInstanceOf(MockitoException.class) - .hasMessageContaining("It is not possible to construct primitive types or abstract types"); - } - - @Test - public void testConstructionMocksMustNotUseCustomMockMaker() { - assertThatThrownBy( - () -> { - try (MockedConstruction ignored = Mockito.mockConstruction( - Dummy.class, - withSettings().mockMaker(MockMakers.INLINE)) - ) { - new Dummy(); - } - }) - .isInstanceOf(IllegalArgumentException.class) - .hasMessageContaining("you cannot override the MockMaker for construction mocks"); - } - - static class Dummy { - - - public Dummy() { - } - - public Dummy(String value) { - } - - String foo() { - return "foo"; - } - } -} diff --git a/subprojects/inline/src/test/java/org/mockitoinline/EnumMockingTest.java b/subprojects/inline/src/test/java/org/mockitoinline/EnumMockingTest.java deleted file mode 100644 index a418aab7a4..0000000000 --- a/subprojects/inline/src/test/java/org/mockitoinline/EnumMockingTest.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (c) 2021 Mockito contributors - * This program is made available under the terms of the MIT License. - */ -package org.mockitoinline; - -import org.junit.Test; -import org.mockito.Mockito; - -import static org.hamcrest.CoreMatchers.*; -import static org.hamcrest.MatcherAssert.assertThat; - -public class EnumMockingTest { - - @Test - public void testMockEnum() { - Animal a = Mockito.mock(Animal.class); - assertThat(a, not(equalTo(Animal.CAT))); - assertThat(a.sound(), nullValue(String.class)); - assertThat(a.name(), nullValue(String.class)); - } - - enum Animal { - CAT { - @Override - public String sound() { - return "meow"; - } - }; - - public abstract String sound(); - } -} diff --git a/subprojects/inline/src/test/java/org/mockitoinline/FinalClassMockingTest.java b/subprojects/inline/src/test/java/org/mockitoinline/FinalClassMockingTest.java deleted file mode 100644 index 80c9de851a..0000000000 --- a/subprojects/inline/src/test/java/org/mockitoinline/FinalClassMockingTest.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright (c) 2017 Mockito contributors - * This program is made available under the terms of the MIT License. - */ -package org.mockitoinline; - -import org.junit.Test; -import org.mockito.Mockito; - -public class FinalClassMockingTest { - - @SuppressWarnings("CheckReturnValue") - @Test - public void no_exception_while_mocking_final_class() throws Exception { - Mockito.mock(FinalClass.class); - } - - private static final class FinalClass { - - } - -} diff --git a/subprojects/inline/src/test/java/org/mockitoinline/HierarchyPreInitializationTest.java b/subprojects/inline/src/test/java/org/mockitoinline/HierarchyPreInitializationTest.java deleted file mode 100644 index 16aed5f368..0000000000 --- a/subprojects/inline/src/test/java/org/mockitoinline/HierarchyPreInitializationTest.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (c) 2017 Mockito contributors - * This program is made available under the terms of the MIT License. - */ -package org.mockitoinline; - -import org.junit.Test; - -import static org.mockito.Mockito.mock; - -public class HierarchyPreInitializationTest { - - @Test - @SuppressWarnings("CheckReturnValue") - public void testOrder() { - mock(MyClass.class); - mock(TestSubInterface.class); - } - - public interface TestInterface { - - @SuppressWarnings("unused") - MyClass INSTANCE = new MyClass().probe(); - } - - public interface TestSubInterface extends TestInterface { - } - - public static class MyClass { - - private final Object obj; - - public MyClass() { - obj = new Object(); - } - - public MyClass probe() { - if (obj == null) { - throw new RuntimeException(); - } - return this; - } - } -} diff --git a/subprojects/inline/src/test/java/org/mockitoinline/InOrderVerificationTest.java b/subprojects/inline/src/test/java/org/mockitoinline/InOrderVerificationTest.java deleted file mode 100644 index fb35adc76f..0000000000 --- a/subprojects/inline/src/test/java/org/mockitoinline/InOrderVerificationTest.java +++ /dev/null @@ -1,213 +0,0 @@ -/* - * Copyright (c) 2022 Mockito contributors - * This program is made available under the terms of the MIT License. - */ -package org.mockitoinline; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.junit.Assert.fail; -import static org.mockito.Mockito.inOrder; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.mockStatic; -import static org.mockito.Mockito.timeout; -import static org.mockito.Mockito.times; - -import org.assertj.core.api.Assert; -import org.junit.Test; -import org.mockito.InOrder; -import org.mockito.MockedStatic; -import org.mockito.exceptions.base.MockitoException; -import org.mockito.exceptions.misusing.NotAMockException; -import org.mockito.exceptions.verification.VerificationInOrderFailure; -import org.mockito.verification.VerificationMode; - -public class InOrderVerificationTest { - @Test - public void shouldVerifyStaticMethods() { - try (MockedStatic mockedStatic = mockStatic(StaticContext.class)) { - // given - InOrder inOrder = inOrder(StaticContext.class); - - // when - StaticContext.firstMethod(); - StaticContext.secondMethod(0); - - // then - inOrder.verify(mockedStatic, StaticContext::firstMethod); - inOrder.verify(mockedStatic, () -> StaticContext.secondMethod(0)); - } - } - - @Test - public void shouldVerifyStaticAndInstanceMethods() { - try (MockedStatic mockedStatic = mockStatic(StaticContext.class)) { - // given - StaticContext mocked = mock(StaticContext.class); - InOrder inOrder = inOrder(mocked, StaticContext.class); - - // when - StaticContext.firstMethod(); - mocked.instanceMethod(); - StaticContext.secondMethod(10); - - // then - inOrder.verify(mockedStatic, StaticContext::firstMethod); - inOrder.verify(mocked).instanceMethod(); - inOrder.verify(mockedStatic, () -> StaticContext.secondMethod(10)); - } - } - - @Test - public void shouldVerifyStaticMethodsWithSimpleAndWrapperModes() { - try (MockedStatic mockedStatic = mockStatic(StaticContext.class)) { - // given - InOrder inOrder = inOrder(StaticContext.class); - - // when - StaticContext.firstMethod(); - StaticContext.firstMethod(); - StaticContext.secondMethod(0); - - // then - inOrder.verify(mockedStatic, StaticContext::firstMethod, times(2)); - inOrder.verify(mockedStatic, () -> StaticContext.secondMethod(0), timeout(100).atLeastOnce()); - } - } - - @Test - public void shouldThrowExceptionWhenModeIsUnsupported() { - try (MockedStatic mockedStatic = mockStatic(StaticContext.class)) { - // given - VerificationMode unsupportedMode = data -> { }; - InOrder inOrder = inOrder(StaticContext.class); - - // when - StaticContext.firstMethod(); - - // then - assertThatThrownBy(() -> - inOrder.verify(mockedStatic, StaticContext::firstMethod, unsupportedMode) - ).isInstanceOf(MockitoException.class); - } - } - - @Test - public void shouldThrowExceptionWhenOrderIsWrong() { - try (MockedStatic mockedStatic = mockStatic(StaticContext.class)) { - // given - InOrder inOrder = inOrder(StaticContext.class); - - // when - StaticContext.firstMethod(); - StaticContext.secondMethod(0); - - // then - assertThatThrownBy(() -> { - inOrder.verify(mockedStatic, () -> StaticContext.secondMethod(0)); - inOrder.verify(mockedStatic, StaticContext::firstMethod); - }).isInstanceOf(VerificationInOrderFailure.class); - } - } - - @Test - public void shouldThrowExceptionWhenNoMoreInteractionsInvokedButThereAre() { - try (MockedStatic mockedStatic = mockStatic(StaticContext.class)) { - // given - InOrder inOrder = inOrder(StaticContext.class); - - // when - StaticContext.firstMethod(); - StaticContext.secondMethod(0); - - // then - inOrder.verify(mockedStatic, StaticContext::firstMethod); - assertThatThrownBy(inOrder::verifyNoMoreInteractions) - .isInstanceOf(VerificationInOrderFailure.class); - } - } - - @Test - public void shouldThrowExceptionWhenNoMoreInteractionsInvokedWithoutVerifyingStaticMethods() { - try (MockedStatic ignored = mockStatic(StaticContext.class)) { - // given - StaticContext mocked = mock(StaticContext.class); - InOrder inOrder = inOrder(StaticContext.class, mocked); - - // when - mocked.instanceMethod(); - StaticContext.firstMethod(); - - // then - inOrder.verify(mocked).instanceMethod(); - assertThatThrownBy(inOrder::verifyNoMoreInteractions) - .isInstanceOf(VerificationInOrderFailure.class); - } - } - - @Test - public void shouldThrowExceptionWhenClassIsNotMocked() { - assertThatThrownBy( - () -> inOrder(StaticContext.class) - ).isInstanceOf(NotAMockException.class); - } - - @Test - public void shouldVerifyStaticMethodsWithoutInterferingWithMocking() { - try (MockedStatic mockedStatic = mockStatic(StaticContext.class)) { - // given - InOrder inOrder = inOrder(StaticContext.class); - Exception expected = new RuntimeException(); - mockedStatic.when(StaticContext::firstMethod).thenThrow(expected); - - // when - Assert actual = assertThatThrownBy(StaticContext::firstMethod); - - // then - actual.isSameAs(expected); - inOrder.verify(mockedStatic, StaticContext::firstMethod); - inOrder.verifyNoMoreInteractions(); - } - } - - @Test - public void shouldThrowExceptionWhenVerifyUsingInOrderWithoutValidClass() { - try (MockedStatic mockedStaticContext = mockStatic(StaticContext.class)) { - try (MockedStatic mockedAnotherStaticContext = mockStatic(AnotherStaticContext.class)) { - // given - InOrder inOrder = inOrder(AnotherStaticContext.class); - - // when - mockedAnotherStaticContext.when(AnotherStaticContext::otherMethod).thenReturn("mocked value"); - StaticContext.firstMethod(); - - // then - assertThat(AnotherStaticContext.otherMethod()) - .isEqualTo("mocked value"); - inOrder.verify(mockedAnotherStaticContext, AnotherStaticContext::otherMethod); - assertThatThrownBy(() -> inOrder.verify(mockedStaticContext, StaticContext::firstMethod)) - .isInstanceOf(VerificationInOrderFailure.class); - } - } - } - - private static class AnotherStaticContext { - static String otherMethod() { - throw new AssertionError("otherMethod should be mocked"); - } - } - - private static class StaticContext { - static void firstMethod() { - fail("firstMethod should be mocked"); - } - - static void secondMethod(int n) { - fail("secondMethod should be mocked but was invoked with argument " + n); - } - - void instanceMethod() { - fail("instanceMethod should be mocked"); - } - } -} diff --git a/subprojects/inline/src/test/java/org/mockitoinline/InitializationTest.java b/subprojects/inline/src/test/java/org/mockitoinline/InitializationTest.java deleted file mode 100644 index c4f62f400f..0000000000 --- a/subprojects/inline/src/test/java/org/mockitoinline/InitializationTest.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (c) 2020 Mockito contributors - * This program is made available under the terms of the MIT License. - */ -package org.mockitoinline; - -import org.junit.Test; -import org.mockito.Mockito; - -import static junit.framework.TestCase.assertEquals; - -public class InitializationTest { - - @Test - public void assure_initialization_prior_to_instrumentation() { - @SuppressWarnings("unused") - SampleEnum mock = Mockito.mock(SampleEnum.class); - SampleEnum[] values = SampleEnum.values(); - assertEquals("VALUE", values[0].name()); - } - - public enum SampleEnum { - VALUE - } -} diff --git a/subprojects/inline/src/test/java/org/mockitoinline/OneLinerStubStressTest.java b/subprojects/inline/src/test/java/org/mockitoinline/OneLinerStubStressTest.java deleted file mode 100644 index 44ff95959e..0000000000 --- a/subprojects/inline/src/test/java/org/mockitoinline/OneLinerStubStressTest.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (c) 2018 Mockito contributors - * This program is made available under the terms of the MIT License. - */ -package org.mockitoinline; - -import org.junit.Test; - -import static org.junit.Assert.assertEquals; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -public class OneLinerStubStressTest { - - public class OneLinerStubTestClass { - public String getStuff() { - return "A"; - } - } - - private static String generateLargeString() { - final int length = 2000000; - final StringBuilder stringBuilder = new StringBuilder(length); - for (int i = 0; i <= length; i++) { - stringBuilder.append("B"); - } - return stringBuilder.toString(); - } - - @Test - public void call_a_lot_of_mocks_using_one_line_stubbing() { - //This requires smaller heap set for the test process, see "inline.gradle" - final String returnValue = generateLargeString(); - for (int i = 0; i < 50000; i++) { - // make sure that mock object does not get cleaned up prematurely - final OneLinerStubTestClass mock = - when(mock(OneLinerStubTestClass.class).getStuff()).thenReturn(returnValue).getMock(); - assertEquals(returnValue, mock.getStuff()); - } - } -} diff --git a/subprojects/inline/src/test/java/org/mockitoinline/PluginTest.java b/subprojects/inline/src/test/java/org/mockitoinline/PluginTest.java deleted file mode 100644 index 16e2da2915..0000000000 --- a/subprojects/inline/src/test/java/org/mockitoinline/PluginTest.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (c) 2017 Mockito contributors - * This program is made available under the terms of the MIT License. - */ -package org.mockitoinline; - -import org.junit.Test; -import org.mockito.internal.configuration.plugins.Plugins; -import org.mockito.internal.creation.bytebuddy.InlineByteBuddyMockMaker; -import org.mockito.internal.util.reflection.ModuleMemberAccessor; - -import static org.junit.Assert.*; - -public class PluginTest { - - @Test - public void mock_maker_should_be_inline() throws Exception { - assertTrue(Plugins.getMockMaker() instanceof InlineByteBuddyMockMaker); - } - - @Test - public void member_accessor_should_be_module() throws Exception { - assertTrue(Plugins.getMemberAccessor() instanceof ModuleMemberAccessor); - } - -} diff --git a/subprojects/inline/src/test/java/org/mockitoinline/RecursionTest.java b/subprojects/inline/src/test/java/org/mockitoinline/RecursionTest.java deleted file mode 100644 index 2a4494e03e..0000000000 --- a/subprojects/inline/src/test/java/org/mockitoinline/RecursionTest.java +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright (c) 2017 Mockito contributors - * This program is made available under the terms of the MIT License. - */ -package org.mockitoinline; - -import org.junit.Test; - -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; - -import static org.mockito.Mockito.spy; - -public class RecursionTest { - - @Test - public void testMockConcurrentHashMap() { - ConcurrentMap map = spy(new ConcurrentHashMap()); - map.putIfAbsent("a", "b"); - } -} diff --git a/subprojects/inline/src/test/java/org/mockitoinline/SpyWithConstructorTest.java b/subprojects/inline/src/test/java/org/mockitoinline/SpyWithConstructorTest.java deleted file mode 100644 index fcaa581123..0000000000 --- a/subprojects/inline/src/test/java/org/mockitoinline/SpyWithConstructorTest.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (c) 2020 Mockito contributors - * This program is made available under the terms of the MIT License. - */ -package org.mockitoinline; - -import org.junit.Before; -import org.junit.Test; - -import static junit.framework.TestCase.assertEquals; -import static org.mockito.Mockito.*; - -public class SpyWithConstructorTest { - - private SomethingAbstract somethingAbstract; - - @Before - public void setUp() { - somethingAbstract = mock(SomethingAbstract.class, withSettings() - .useConstructor("foo") - .defaultAnswer(CALLS_REAL_METHODS)); - } - - @Test - public void shouldUseConstructor() { - assertEquals("foo", somethingAbstract.getValue()); - } - - static abstract class SomethingAbstract { - - private final String value; - - SomethingAbstract(String value) { - this.value = value; - } - - public String getValue() { - return value; - } - } -} diff --git a/subprojects/inline/src/test/java/org/mockitoinline/StaticMockRuleTest.java b/subprojects/inline/src/test/java/org/mockitoinline/StaticMockRuleTest.java deleted file mode 100644 index c54d6a6cf1..0000000000 --- a/subprojects/inline/src/test/java/org/mockitoinline/StaticMockRuleTest.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (c) 2020 Mockito contributors - * This program is made available under the terms of the MIT License. - */ -package org.mockitoinline; - -import org.junit.Rule; -import org.junit.Test; -import org.mockito.Mock; -import org.mockito.MockedStatic; -import org.mockito.junit.MockitoJUnit; -import org.mockito.junit.MockitoRule; - -import static junit.framework.TestCase.*; - -public final class StaticMockRuleTest { - - @Rule - public MockitoRule mockitoRule = MockitoJUnit.rule(); - - @Mock - private MockedStatic dummy; - - @Test - public void testStaticMockSimple() { - assertNull(Dummy.foo()); - } - - @Test - public void testStaticMockWithVerification() { - dummy.when(Dummy::foo).thenReturn("bar"); - assertEquals("bar", Dummy.foo()); - dummy.verify(Dummy::foo); - } - - static class Dummy { - - static String foo() { - return "foo"; - } - } -} diff --git a/subprojects/inline/src/test/java/org/mockitoinline/StaticMockTest.java b/subprojects/inline/src/test/java/org/mockitoinline/StaticMockTest.java deleted file mode 100644 index c9f7a58cce..0000000000 --- a/subprojects/inline/src/test/java/org/mockitoinline/StaticMockTest.java +++ /dev/null @@ -1,248 +0,0 @@ -/* - * Copyright (c) 2020 Mockito contributors - * This program is made available under the terms of the MIT License. - */ -package org.mockitoinline; - -import static junit.framework.TestCase.assertEquals; -import static junit.framework.TestCase.assertNull; -import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.times; - -import java.util.concurrent.atomic.AtomicReference; - -import org.junit.Test; -import org.mockito.MockedStatic; -import org.mockito.Mockito; -import org.mockito.exceptions.base.MockitoException; -import org.mockito.exceptions.verification.NoInteractionsWanted; -import org.mockito.exceptions.verification.WantedButNotInvoked; - -public final class StaticMockTest { - - @Test - public void testStaticMockSimple() { - assertEquals("foo", Dummy.foo()); - try (MockedStatic ignored = Mockito.mockStatic(Dummy.class)) { - assertNull(Dummy.foo()); - } - assertEquals("foo", Dummy.foo()); - } - - @Test - public void testStaticMockWithVerification() { - try (MockedStatic dummy = Mockito.mockStatic(Dummy.class)) { - dummy.when(Dummy::foo).thenReturn("bar"); - assertEquals("bar", Dummy.foo()); - dummy.verify(Dummy::foo); - } - } - - @Test - public void testStaticMockWithVerificationFailed() { - try (MockedStatic dummy = Mockito.mockStatic(Dummy.class)) { - assertThatThrownBy( - () -> { - dummy.verify(Dummy::foo); - }) - .isInstanceOf(WantedButNotInvoked.class) - .hasMessageContaining("there were zero interactions with this mock"); - } - } - - @Test - public void testStaticMockWithNoInteractions() { - try (MockedStatic dummy = Mockito.mockStatic(Dummy.class)) { - dummy.when(Dummy::foo).thenReturn("bar"); - dummy.verifyNoInteractions(); - } - } - - @Test - public void testStaticMockWithNoInteractionsFailed() { - try (MockedStatic dummy = Mockito.mockStatic(Dummy.class)) { - dummy.when(Dummy::foo).thenReturn("bar"); - assertEquals("bar", Dummy.foo()); - assertThatThrownBy( - () -> { - dummy.verifyNoInteractions(); - }) - .isInstanceOf(NoInteractionsWanted.class) - .hasMessageContaining("No interactions wanted here") - .hasMessageContaining("above is the only interaction with this mock."); - } - } - - @Test - public void testStaticMockWithNoMoreInteractions() { - try (MockedStatic dummy = Mockito.mockStatic(Dummy.class)) { - dummy.when(Dummy::foo).thenReturn("bar"); - assertEquals("bar", Dummy.foo()); - dummy.verify(Dummy::foo); - dummy.verifyNoMoreInteractions(); - } - } - - @Test - public void testStaticMockWithNoMoreInteractionsFailed() { - try (MockedStatic dummy = Mockito.mockStatic(Dummy.class)) { - dummy.when(Dummy::foo).thenReturn("bar"); - assertEquals("bar", Dummy.foo()); - assertThatThrownBy( - () -> { - dummy.verifyNoInteractions(); - }) - .isInstanceOf(NoInteractionsWanted.class) - .hasMessageContaining("No interactions wanted here") - .hasMessageContaining("above is the only interaction with this mock."); - } - } - - @Test - public void testStaticMockWithDefaultAnswer() { - try (MockedStatic dummy = Mockito.mockStatic(Dummy.class, invocation -> "bar")) { - assertEquals("bar", Dummy.foo()); - dummy.verify(Dummy::foo); - } - } - - @Test - public void testStaticMockWithRealMethodCall() { - try (MockedStatic dummy = Mockito.mockStatic(Dummy.class)) { - dummy.when(Dummy::foo).thenCallRealMethod(); - assertEquals("foo", Dummy.foo()); - dummy.verify(Dummy::foo); - } - } - - @Test - public void testStaticMockReset() { - try (MockedStatic dummy = Mockito.mockStatic(Dummy.class)) { - dummy.when(Dummy::foo).thenReturn("bar"); - dummy.reset(); - assertNull(Dummy.foo()); - } - } - - @Test - public void testStaticMockClear() { - try (MockedStatic dummy = Mockito.mockStatic(Dummy.class)) { - dummy.when(Dummy::foo).thenReturn("bar"); - assertEquals("bar", Dummy.foo()); - dummy.clearInvocations(); - dummy.verifyNoInteractions(); - } - } - - @Test - public void testStaticMockDoesNotAffectDifferentThread() throws InterruptedException { - try (MockedStatic dummy = Mockito.mockStatic(Dummy.class)) { - dummy.when(Dummy::foo).thenReturn("bar"); - assertEquals("bar", Dummy.foo()); - dummy.verify(Dummy::foo); - AtomicReference reference = new AtomicReference<>(); - Thread thread = new Thread(() -> reference.set(Dummy.foo())); - thread.start(); - thread.join(); - assertEquals("foo", reference.get()); - dummy.when(Dummy::foo).thenReturn("bar"); - assertEquals("bar", Dummy.foo()); - dummy.verify(Dummy::foo, times(2)); - } - } - - @Test - public void testStaticMockCanCoexistWithMockInDifferentThread() throws InterruptedException { - try (MockedStatic dummy = Mockito.mockStatic(Dummy.class)) { - dummy.when(Dummy::foo).thenReturn("bar"); - assertEquals("bar", Dummy.foo()); - dummy.verify(Dummy::foo); - AtomicReference reference = new AtomicReference<>(); - Thread thread = new Thread(() -> { - try (MockedStatic dummy2 = Mockito.mockStatic(Dummy.class)) { - dummy2.when(Dummy::foo).thenReturn("qux"); - reference.set(Dummy.foo()); - } - }); - thread.start(); - thread.join(); - assertEquals("qux", reference.get()); - dummy.when(Dummy::foo).thenReturn("bar"); - assertEquals("bar", Dummy.foo()); - dummy.verify(Dummy::foo, times(2)); - } - } - - @Test - public void testStaticMockMustBeExclusiveInScopeWithinThread() { - assertThatThrownBy( - () -> { - try ( - MockedStatic dummy = Mockito.mockStatic(Dummy.class); - MockedStatic duplicate = Mockito.mockStatic(Dummy.class) - ) { - } - }) - .isInstanceOf(MockitoException.class) - .hasMessageContaining("static mocking is already registered in the current thread"); - } - - @Test - public void testStaticMockVoid() { - try (MockedStatic dummy = Mockito.mockStatic(Dummy.class)) { - Dummy.fooVoid("bar"); - assertNull(Dummy.var1); - dummy.verify(() -> Dummy.fooVoid("bar")); - } - Dummy.fooVoid("bar"); - assertEquals("bar", Dummy.var1); - } - - @Test - public void testStaticMockMustUseValidMatchers() { - try (MockedStatic mockedClass = Mockito.mockStatic(Dummy.class)) { - assertThatThrownBy( - () -> { - mockedClass.when(() -> Dummy.fooVoid("foo", any())).thenReturn(null); - }) - .hasMessageContaining("Invalid use of argument matchers!"); - - Dummy.fooVoid("foo", "bar"); - } - } - - @Test - public void testStaticMockVarargs() { - assertEquals("foobar", Dummy.fooVarargs("foo", "bar")); - try (MockedStatic ignored = Mockito.mockStatic(Dummy.class)) { - assertNull(Dummy.fooVarargs("foo", "bar")); - } - assertEquals("foobar", Dummy.fooVarargs("foo", "bar")); - } - - static class Dummy { - - static String var1 = null; - - static String foo() { - return "foo"; - } - - static void fooVoid(String var2) { - var1 = var2; - } - - static void fooVoid(String var2, String var3) { - var1 = var2; - } - - static String fooVarargs(String... args) { - StringBuilder sb = new StringBuilder(); - for (String arg : args) { - sb.append(arg); - } - return sb.toString(); - } - } -} diff --git a/subprojects/inline/src/test/java/org/mockitoinline/StaticRuleTest.java b/subprojects/inline/src/test/java/org/mockitoinline/StaticRuleTest.java deleted file mode 100644 index 68b9c6a616..0000000000 --- a/subprojects/inline/src/test/java/org/mockitoinline/StaticRuleTest.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (c) 2018 Mockito contributors - * This program is made available under the terms of the MIT License. - */ -package org.mockitoinline; - -import org.junit.Rule; -import org.junit.Test; -import org.mockito.Mock; -import org.mockito.MockedStatic; -import org.mockito.junit.MockitoJUnit; -import org.mockito.junit.MockitoRule; - -import java.util.UUID; - -import static junit.framework.TestCase.assertEquals; - -public final class StaticRuleTest { - - @Rule - public MockitoRule mockitoRule = MockitoJUnit.rule(); - - @Mock - private MockedStatic mock; - - @Test - public void runs() { - mock.when(UUID::randomUUID).thenReturn(new UUID(123, 456)); - assertEquals(UUID.randomUUID(), new UUID(123, 456)); - } -} diff --git a/subprojects/inline/src/test/java/org/mockitoinline/StaticRunnerTest.java b/subprojects/inline/src/test/java/org/mockitoinline/StaticRunnerTest.java deleted file mode 100644 index e0159597f7..0000000000 --- a/subprojects/inline/src/test/java/org/mockitoinline/StaticRunnerTest.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2018 Mockito contributors - * This program is made available under the terms of the MIT License. - */ -package org.mockitoinline; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.MockedStatic; -import org.mockito.junit.MockitoJUnitRunner; - -import java.util.UUID; - -import static junit.framework.TestCase.assertEquals; - -@RunWith(MockitoJUnitRunner.class) -public final class StaticRunnerTest { - - @Mock - private MockedStatic mock; - - @Test - public void runs() { - mock.when(UUID::randomUUID).thenReturn(new UUID(123, 456)); - assertEquals(UUID.randomUUID(), new UUID(123, 456)); - } -} diff --git a/subprojects/inline/src/test/java/org/mockitoinline/StressTest.java b/subprojects/inline/src/test/java/org/mockitoinline/StressTest.java deleted file mode 100644 index c6a55064d4..0000000000 --- a/subprojects/inline/src/test/java/org/mockitoinline/StressTest.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2018 Mockito contributors - * This program is made available under the terms of the MIT License. - */ -package org.mockitoinline; - -import org.junit.Test; - -import static org.junit.Assert.assertEquals; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; -import static org.mockito.Mockito.withSettings; - -public class StressTest { - public class TestClass { - public String getStuff() { - return "A"; - } - } - - @Test - public void call_a_lot_of_mocks() { - //This requires smaller heap set for the test process, see "inline.gradle" - for (int i = 0; i < 40000; i++) { - TestClass mock = mock(TestClass.class); - when(mock.getStuff()).thenReturn("B"); - assertEquals("B", mock.getStuff()); - - TestClass serializableMock = mock(TestClass.class, withSettings().serializable()); - when(serializableMock.getStuff()).thenReturn("C"); - assertEquals("C", serializableMock.getStuff()); - - if (i % 1024 == 0) { - System.out.println(i + "/40000 mocks called"); - } - } - } -} diff --git a/subprojects/inline/src/test/java/org/mockitoinline/StubbingLocationTest.java b/subprojects/inline/src/test/java/org/mockitoinline/StubbingLocationTest.java deleted file mode 100644 index 8476006425..0000000000 --- a/subprojects/inline/src/test/java/org/mockitoinline/StubbingLocationTest.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2017 Mockito contributors - * This program is made available under the terms of the MIT License. - */ -package org.mockitoinline; - -import java.util.Collections; -import java.util.Set; -import org.junit.Test; -import org.mockito.internal.invocation.finder.AllInvocationsFinder; -import org.mockito.stubbing.Stubbing; - -import static org.junit.Assert.assertEquals; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -public class StubbingLocationTest { - - @Test - public void stubbing_location_should_be_the_correct_point() { - ConcreteClass mock = mock(ConcreteClass.class); - String frame; - // Initializing 'frame' at the method parameter point is to gain the exact line number of the stubbing point. - when(mock.concreteMethod(frame = Thread.currentThread().getStackTrace()[1].toString())).thenReturn(""); - mock.concreteMethod(frame); - Set stubbings = AllInvocationsFinder.findStubbings(Collections.singleton(mock)); - assertEquals(1, stubbings.size()); - String location = stubbings.iterator().next().getInvocation().getLocation().toString(); - assertEquals("-> at " + frame, location); - } - - static final class ConcreteClass { - String concreteMethod(String s) { - throw new RuntimeException(s); - } - } - -} diff --git a/subprojects/inline/src/test/java/org/mockitoinline/SubconstructorMockTest.java b/subprojects/inline/src/test/java/org/mockitoinline/SubconstructorMockTest.java deleted file mode 100644 index 0dd65cb6f7..0000000000 --- a/subprojects/inline/src/test/java/org/mockitoinline/SubconstructorMockTest.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) 2017 Mockito contributors - * This program is made available under the terms of the MIT License. - */ -package org.mockitoinline; - -import org.junit.Test; -import org.mockito.MockedConstruction; -import org.mockito.Mockito; - -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -public class SubconstructorMockTest { - - @Test - public void does_not_mock_subclass_constructor_for_superclass_mock() { - try (MockedConstruction mocked = Mockito.mockConstruction(SubClass.class)) { } - try (MockedConstruction mocked = Mockito.mockConstruction(SuperClass.class)) { - SubClass value = new SubClass(); - assertTrue(value.sup()); - assertTrue(value.sub()); - } - } - - @Test - public void does_mock_superclass_constructor_for_subclass_mock() { - try (MockedConstruction mocked = Mockito.mockConstruction(SuperClass.class)) { } - try (MockedConstruction mocked = Mockito.mockConstruction(SubClass.class)) { - SubClass value = new SubClass(); - assertFalse(value.sup()); - assertFalse(value.sub()); - } - } - - public static class SuperClass { - public boolean sup() { - return true; - } - } - - public static class SubClass extends SuperClass { - public boolean sub() { - return true; - } - } -} diff --git a/subprojects/inline/src/test/java/org/mockitoinline/SuperCallTest.java b/subprojects/inline/src/test/java/org/mockitoinline/SuperCallTest.java deleted file mode 100644 index 1fe81969d4..0000000000 --- a/subprojects/inline/src/test/java/org/mockitoinline/SuperCallTest.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (c) 2017 Mockito contributors - * This program is made available under the terms of the MIT License. - */ -package org.mockitoinline; - -import org.junit.Test; - -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.verify; - -public final class SuperCallTest { - - @Test - public void testSuperMethodCall() { - Dummy d = spy(new Dummy()); - d.foo(); - verify(d).bar(eq("baz")); - } - - static class Dummy { - - public void foo() { - bar("baz"); - } - - // Also fails if public. - void bar(String s) { - return; - } - } -} diff --git a/subprojects/inline/src/test/java/org/mockitoinline/bugs/CyclicMockMethodArgumentMemoryLeakTest.java b/subprojects/inline/src/test/java/org/mockitoinline/bugs/CyclicMockMethodArgumentMemoryLeakTest.java deleted file mode 100644 index 20efc9daaa..0000000000 --- a/subprojects/inline/src/test/java/org/mockitoinline/bugs/CyclicMockMethodArgumentMemoryLeakTest.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2019 Mockito contributors - * This program is made available under the terms of the MIT License. - */ -package org.mockitoinline.bugs; - -import org.junit.Test; - -import static org.mockito.Mockito.framework; -import static org.mockito.Mockito.mock; - -public class CyclicMockMethodArgumentMemoryLeakTest { - private static final int ARRAY_LENGTH = 1 << 20; // 4 MB - - @Test - public void no_memory_leak_when_cyclically_calling_method_with_mocks() { - for (int i = 0; i < 100; ++i) { - final A a = mock(A.class); - a.largeArray = new int[ARRAY_LENGTH]; - final B b = mock(B.class); - - a.accept(b); - b.accept(a); - - framework().clearInlineMocks(); - } - } - - private static class A { - private int[] largeArray; - - void accept(B b) {} - } - - private static class B { - void accept(A a) {} - } -} diff --git a/subprojects/inline/src/test/java/org/mockitoinline/bugs/OngoingStubShiftTest.java b/subprojects/inline/src/test/java/org/mockitoinline/bugs/OngoingStubShiftTest.java deleted file mode 100644 index 47062fedfd..0000000000 --- a/subprojects/inline/src/test/java/org/mockitoinline/bugs/OngoingStubShiftTest.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (c) 2007 Mockito contributors - * This program is made available under the terms of the MIT License. - */ -package org.mockitoinline.bugs; - -import static org.junit.Assert.assertEquals; -import org.junit.Test; -import org.mockito.MockedStatic; -import static org.mockito.Mockito.CALLS_REAL_METHODS; -import static org.mockito.Mockito.mockStatic; - -public class OngoingStubShiftTest { - - private static class StaticInt { - static int getInt() { - return 1; - } - } - - private static class StaticStr { - static String getStr() { - return Integer.toString(StaticInt.getInt()); - } - } - - @Test - public void keep_ongoing_stub_when_spy() { - try (MockedStatic mockInt = mockStatic(StaticInt.class); - MockedStatic mockStr = mockStatic(StaticStr.class, CALLS_REAL_METHODS)) { - - mockStr.when(StaticStr::getStr).thenReturn("1"); - assertEquals("1", StaticStr.getStr()); - } - } - - private static class StaticWithException { - static String getString() { - return Integer.toString(getInt()); - } - - static int getInt() { - throw new NullPointerException(); - } - } - - @Test - public void keep_ongoing_stub_when_exception() { - try (MockedStatic mock = mockStatic(StaticWithException.class, CALLS_REAL_METHODS)) { - mock.when(StaticWithException::getString).thenReturn("1"); - assertEquals("1", StaticWithException.getString()); - } - } -} diff --git a/subprojects/inline/src/test/java/org/mockitoinline/bugs/SelfSpyReferenceMemoryLeakTest.java b/subprojects/inline/src/test/java/org/mockitoinline/bugs/SelfSpyReferenceMemoryLeakTest.java deleted file mode 100644 index 678e43c82f..0000000000 --- a/subprojects/inline/src/test/java/org/mockitoinline/bugs/SelfSpyReferenceMemoryLeakTest.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (c) 2019 Mockito contributors - * This program is made available under the terms of the MIT License. - */ -package org.mockitoinline.bugs; - -import org.junit.Test; - -import static org.mockito.Mockito.framework; -import static org.mockito.Mockito.spy; - -public class SelfSpyReferenceMemoryLeakTest { - private static final int ARRAY_LENGTH = 1 << 20; // 4 MB - - @Test - public void no_memory_leak_when_spy_holds_reference_to_self() { - for (int i = 0; i < 100; ++i) { - final DeepRefSelfClass instance = spy(new DeepRefSelfClass()); - instance.refInstance(instance); - - framework().clearInlineMocks(); - } - } - - private static class DeepRefSelfClass { - private final DeepRefSelfClass[] array = new DeepRefSelfClass[1]; - - private final int[] largeArray = new int[ARRAY_LENGTH]; - - private void refInstance(DeepRefSelfClass instance) { - array[0] = instance; - } - } -}