diff --git a/src/main/java/org/mockito/internal/creation/bytebuddy/InlineBytecodeGenerator.java b/src/main/java/org/mockito/internal/creation/bytebuddy/InlineBytecodeGenerator.java index 077bf9780d..10b73c81a2 100644 --- a/src/main/java/org/mockito/internal/creation/bytebuddy/InlineBytecodeGenerator.java +++ b/src/main/java/org/mockito/internal/creation/bytebuddy/InlineBytecodeGenerator.java @@ -252,8 +252,8 @@ private void triggerRetransformation(Set> types, boolean flat) { } else { do { if (mocked.add(type)) { - assureInitialization(type); if (!flatMocked.remove(type)) { + assureInitialization(type); targets.add(type); } addInterfaces(targets, type.getInterfaces()); @@ -356,6 +356,7 @@ private void addInterfaces(Set> types, Class[] interfaces) { for (Class type : interfaces) { if (mocked.add(type)) { if (!flatMocked.remove(type)) { + assureInitialization(type); types.add(type); } addInterfaces(types, type.getInterfaces()); diff --git a/subprojects/inline/src/test/java/org/mockitoinline/HierarchyPreInitializationTest.java b/subprojects/inline/src/test/java/org/mockitoinline/HierarchyPreInitializationTest.java new file mode 100644 index 0000000000..340cd470e7 --- /dev/null +++ b/subprojects/inline/src/test/java/org/mockitoinline/HierarchyPreInitializationTest.java @@ -0,0 +1,40 @@ +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; + } + } +}