Skip to content

Commit 58ba445

Browse files
jselboJoshua Selbo
andauthored
Forbid mocking WeakReference with inline mock maker (#3759)
Fixes #3758 Co-authored-by: Joshua Selbo <jselbo@meta.com>
1 parent 966d600 commit 58ba445

3 files changed

Lines changed: 16 additions & 5 deletions

File tree

mockito-core/src/main/java/org/mockito/internal/creation/bytebuddy/InlineBytecodeGenerator.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import java.lang.instrument.ClassFileTransformer;
3737
import java.lang.instrument.Instrumentation;
3838
import java.lang.instrument.UnmodifiableClassException;
39+
import java.lang.ref.WeakReference;
3940
import java.lang.reflect.Method;
4041
import java.lang.reflect.Modifier;
4142
import java.security.ProtectionDomain;
@@ -65,7 +66,8 @@ public class InlineBytecodeGenerator implements BytecodeGenerator, ClassFileTran
6566
Long.class,
6667
Float.class,
6768
Double.class,
68-
String.class));
69+
String.class,
70+
WeakReference.class));
6971

7072
private final Instrumentation instrumentation;
7173

mockito-core/src/main/java/org/mockito/internal/creation/bytebuddy/InlineDelegateByteBuddyMockMaker.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -596,7 +596,7 @@ public String nonMockableReason() {
596596
return "primitive type";
597597
}
598598
if (EXCLUDES.contains(type)) {
599-
return "Cannot mock wrapper types, String.class or Class.class";
599+
return "Cannot mock primitive wrapper types, String, Class, or WeakReference";
600600
}
601601
return "VM does not support modification of given type";
602602
}

mockito-core/src/test/java/org/mockito/internal/creation/bytebuddy/InlineDelegateByteBuddyMockMakerTest.java

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import static org.junit.Assert.*;
1111

1212
import java.io.IOException;
13+
import java.lang.ref.WeakReference;
1314
import java.util.*;
1415
import java.util.concurrent.Callable;
1516
import java.util.regex.Pattern;
@@ -369,7 +370,7 @@ public void should_handle_missing_or_inconsistent_stack_trace() {
369370
public void should_provide_reason_for_wrapper_class() {
370371
MockMaker.TypeMockability mockable = mockMaker.isTypeMockable(Integer.class);
371372
assertThat(mockable.nonMockableReason())
372-
.isEqualTo("Cannot mock wrapper types, String.class or Class.class");
373+
.isEqualTo("Cannot mock primitive wrapper types, String, Class, or WeakReference");
373374
}
374375

375376
@Test
@@ -394,15 +395,23 @@ public void is_type_mockable_excludes_String() {
394395
MockMaker.TypeMockability mockable = mockMaker.isTypeMockable(String.class);
395396
assertThat(mockable.mockable()).isFalse();
396397
assertThat(mockable.nonMockableReason())
397-
.contains("Cannot mock wrapper types, String.class or Class.class");
398+
.contains("Cannot mock primitive wrapper types, String, Class, or WeakReference");
398399
}
399400

400401
@Test
401402
public void is_type_mockable_excludes_Class() {
402403
MockMaker.TypeMockability mockable = mockMaker.isTypeMockable(Class.class);
403404
assertThat(mockable.mockable()).isFalse();
404405
assertThat(mockable.nonMockableReason())
405-
.contains("Cannot mock wrapper types, String.class or Class.class");
406+
.contains("Cannot mock primitive wrapper types, String, Class, or WeakReference");
407+
}
408+
409+
@Test
410+
public void is_type_mockable_excludes_WeakReference() {
411+
MockMaker.TypeMockability mockable = mockMaker.isTypeMockable(WeakReference.class);
412+
assertThat(mockable.mockable()).isFalse();
413+
assertThat(mockable.nonMockableReason())
414+
.contains("Cannot mock primitive wrapper types, String, Class, or WeakReference");
406415
}
407416

408417
@Test

0 commit comments

Comments
 (0)