View Javadoc
1   /*
2    * MIT License
3    * Copyright (c) 2006-2025 JMockit developers
4    * See LICENSE file for full license text.
5    */
6   package mockit.internal;
7   
8   import static org.junit.jupiter.api.Assertions.assertNotNull;
9   import static org.junit.jupiter.api.Assertions.assertThrows;
10  import static org.junit.jupiter.api.Assertions.assertTrue;
11  
12  import mockit.asm.classes.ClassReader;
13  
14  import org.junit.jupiter.api.Test;
15  
16  final class ClassFileTest {
17  
18      @Test
19      void createClassReaderWithValidClass() {
20          ClassLoader cl = ClassFileTest.class.getClassLoader();
21          ClassReader reader = ClassFile.createClassReader(cl, "mockit/internal/ClassFile");
22          assertNotNull(reader);
23      }
24  
25      @Test
26      void createClassReaderWithNonExistentClassReturnsNull() {
27          ClassLoader cl = ClassFileTest.class.getClassLoader();
28          ClassReader reader = ClassFile.createClassReader(cl, "com/example/DoesNotExist");
29          // Should return null when class file not found
30          assertTrue(reader == null);
31      }
32  
33      @Test
34      void createReaderOrGetFromCacheForKnownClass() {
35          ClassReader reader = ClassFile.createReaderOrGetFromCache(String.class);
36          assertNotNull(reader);
37      }
38  
39      @Test
40      void createReaderOrGetFromCacheReturnsCachedReader() {
41          // Call twice to test caching
42          ClassReader reader1 = ClassFile.createReaderOrGetFromCache(Integer.class);
43          ClassReader reader2 = ClassFile.createReaderOrGetFromCache(Integer.class);
44          assertNotNull(reader1);
45          assertNotNull(reader2);
46      }
47  
48      @Test
49      void createReaderOrGetFromCacheForNonCachedClass() {
50          // Use a class that's unlikely to be in CachedClassfiles (test-only class)
51          ClassReader reader = ClassFile.createReaderOrGetFromCache(ClassFileTest.class);
52          assertNotNull(reader);
53          // Call again to hit the CLASS_FILES cache
54          ClassReader reader2 = ClassFile.createReaderOrGetFromCache(ClassFileTest.class);
55          assertNotNull(reader2);
56      }
57  
58      @Test
59      void getClassFileByNameForKnownClass() {
60          byte[] bytes = ClassFile.getClassFile("java/lang/String");
61          assertNotNull(bytes);
62          assertTrue(bytes.length > 0);
63      }
64  
65      @Test
66      void getClassFileByClassForKnownClass() {
67          byte[] bytes = ClassFile.getClassFile(String.class);
68          assertNotNull(bytes);
69          assertTrue(bytes.length > 0);
70      }
71  
72      @Test
73      void getClassFileByLoaderAndNameForKnownClass() {
74          byte[] bytes = ClassFile.getClassFile(ClassFileTest.class.getClassLoader(), "mockit/internal/ClassFile");
75          assertNotNull(bytes);
76          assertTrue(bytes.length > 0);
77      }
78  
79      @Test
80      void readBytesFromClassFileByName() {
81          byte[] bytes = ClassFile.readBytesFromClassFile("mockit/internal/ClassFile");
82          assertNotNull(bytes);
83          assertTrue(bytes.length > 0);
84      }
85  
86      @Test
87      void readBytesFromClassFileByClass() {
88          byte[] bytes = ClassFile.readBytesFromClassFile(ClassFileTest.class);
89          assertNotNull(bytes);
90          assertTrue(bytes.length > 0);
91      }
92  
93      @Test
94      void readBytesFromClassFileThrowsForUnknownClass() {
95          assertThrows(RuntimeException.class, () -> ClassFile.readBytesFromClassFile("com/example/DoesNotExist"));
96      }
97  
98      @Test
99      void notFoundExceptionHasCorrectMessage() {
100         try {
101             ClassFile.readBytesFromClassFile("com/example/Missing");
102         } catch (RuntimeException e) {
103             // Expected
104         }
105     }
106 
107     @Test
108     void createReaderFromLastRedefinitionIfAny() {
109         ClassReader reader = ClassFile.createReaderFromLastRedefinitionIfAny(String.class);
110         assertNotNull(reader);
111     }
112 }