Mockito cannot mock this class: class inventory.repository.InventoryRepository.

201 views
Skip to first unread message

Stefan Bodea

unread,
Apr 28, 2023, 7:57:26 AM4/28/23
to mockito
Hello, i've got this error:

Mockito can only mock non-private & non-final classes.
If you're not sure why you're getting this error, please report to the mailing list.


Java               : 17
JVM vendor name    : Oracle Corporation
JVM vendor version : 17.0.1+12-39
JVM name           : OpenJDK 64-Bit Server VM
JVM version        : 17.0.1+12-39
JVM info           : mixed mode
OS name            : Linux
OS version         : 5.15.0-69-generic


Underlying exception : java.lang.IllegalStateException: Error invoking java.lang.invoke.MethodHandles$Lookup#defineClass

at inventory/inventory.service.InventoryServiceTestMock.setUp(InventoryServiceTestMock.java:26)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:686)
at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131)
at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149)
at org.junit.jupiter.engine.extension.TimeoutExtension.interceptLifecycleMethod(TimeoutExtension.java:126)
at org.junit.jupiter.engine.extension.TimeoutExtension.interceptBeforeAllMethod(TimeoutExtension.java:68)
at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115)
at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37)
at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104)
at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98)
at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeBeforeAllMethods$8(ClassBasedTestDescriptor.java:375)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeBeforeAllMethods(ClassBasedTestDescriptor.java:373)
at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.before(ClassBasedTestDescriptor.java:193)
at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.before(ClassBasedTestDescriptor.java:78)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:132)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)
at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)
at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:248)
at org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$5(DefaultLauncher.java:211)
at org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:226)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:199)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:132)
at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:71)
at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38)
at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11)
at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35)
at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:235)
at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54)
Caused by: java.lang.IllegalStateException: Error invoking java.lang.invoke.MethodHandles$Lookup#defineClass
at net.bytebuddy.dynamic.loading.ClassInjector$UsingLookup$Dispatcher$ForJava9CapableVm.defineClass(ClassInjector.java:1645)
at net.bytebuddy.dynamic.loading.ClassInjector$UsingLookup.injectRaw(ClassInjector.java:1374)
at net.bytebuddy.dynamic.loading.ClassInjector$AbstractBase.inject(ClassInjector.java:93)
at net.bytebuddy.dynamic.loading.ClassLoadingStrategy$UsingLookup.load(ClassLoadingStrategy.java:451)
at net.bytebuddy.dynamic.TypeResolutionStrategy$Passive.initialize(TypeResolutionStrategy.java:85)
at net.bytebuddy.dynamic.DynamicType$Default$Unloaded.load(DynamicType.java:5468)
at org.mockito.internal.creation.bytebuddy.SubclassBytecodeGenerator.mockClass(SubclassBytecodeGenerator.java:129)
at org.mockito.internal.creation.bytebuddy.TypeCachingBytecodeGenerator$1.call(TypeCachingBytecodeGenerator.java:37)
at org.mockito.internal.creation.bytebuddy.TypeCachingBytecodeGenerator$1.call(TypeCachingBytecodeGenerator.java:34)
at net.bytebuddy.TypeCache.findOrInsert(TypeCache.java:137)
at net.bytebuddy.TypeCache$WithInlineExpunction.findOrInsert(TypeCache.java:350)
at net.bytebuddy.TypeCache.findOrInsert(TypeCache.java:159)
at net.bytebuddy.TypeCache$WithInlineExpunction.findOrInsert(TypeCache.java:361)
at org.mockito.internal.creation.bytebuddy.TypeCachingBytecodeGenerator.mockClass(TypeCachingBytecodeGenerator.java:32)
at org.mockito.internal.creation.bytebuddy.SubclassByteBuddyMockMaker.createMockType(SubclassByteBuddyMockMaker.java:71)
at org.mockito.internal.creation.bytebuddy.SubclassByteBuddyMockMaker.createMock(SubclassByteBuddyMockMaker.java:42)
at org.mockito.internal.creation.bytebuddy.ByteBuddyMockMaker.createMock(ByteBuddyMockMaker.java:25)
at org.mockito.internal.util.MockUtil.createMock(MockUtil.java:35)
at org.mockito.internal.MockitoCore.mock(MockitoCore.java:69)
at org.mockito.Mockito.mock(Mockito.java:1895)
at org.mockito.Mockito.mock(Mockito.java:1804)
... 56 more
Caused by: java.lang.IllegalAccessError: superclass access check failed: class org.mockito.codegen.InventoryRepository$MockitoMock$1748851131 (in unnamed module @0x69b0fd6f) cannot access class inventory.repository.InventoryRepository (in module inventory) because module inventory does not export inventory.repository to unnamed module @0x69b0fd6f
at java.base/java.lang.ClassLoader.defineClass0(Native Method)
at java.base/java.lang.System$2.defineClass(System.java:2307)
at java.base/java.lang.invoke.MethodHandles$Lookup$ClassDefiner.defineClass(MethodHandles.java:2439)
at java.base/java.lang.invoke.MethodHandles$Lookup$ClassDefiner.defineClass(MethodHandles.java:2416)
at java.base/java.lang.invoke.MethodHandles$Lookup.defineClass(MethodHandles.java:1843)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at net.bytebuddy.dynamic.loading.ClassInjector$UsingLookup$Dispatcher$ForJava9CapableVm.defineClass(ClassInjector.java:1641)
... 76 more



But the InventoryRepository is not final or private, neither any class or method in it.

This is the InventoryRepository class:

public class InventoryRepository {

private String filename = "data/items.txt";
private Inventory inventory;

public InventoryRepository(){
this.inventory=new Inventory();
readParts();
readProducts();
}

public void readParts(){
//ClassLoader classLoader = InventoryRepository.class.getClassLoader();
File file = new File(filename);
ObservableList<Part> listP = FXCollections.observableArrayList();
BufferedReader br = null;
try {
br = new BufferedReader(new FileReader(file));
String line = null;
while((line=br.readLine())!=null){
Part part=getPartFromString(line);
if (part!=null)
listP.add(part);
}
br.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
inventory.setAllParts(listP);
}

private Part getPartFromString(String line){
Part item=null;
if (line==null|| line.equals("")) return null;
StringTokenizer st=new StringTokenizer(line, ",");
String type=st.nextToken();
if (type.equals("I")) {
int id= Integer.parseInt(st.nextToken());
inventory.setAutoPartId(id);
String name= st.nextToken();
double price = Double.parseDouble(st.nextToken());
int inStock = Integer.parseInt(st.nextToken());
int minStock = Integer.parseInt(st.nextToken());
int maxStock = Integer.parseInt(st.nextToken());
int idMachine= Integer.parseInt(st.nextToken());
item = new InhousePart(id, name, price, inStock, minStock, maxStock, idMachine);
}
if (type.equals("O")) {
int id= Integer.parseInt(st.nextToken());
inventory.setAutoPartId(id);
String name= st.nextToken();
double price = Double.parseDouble(st.nextToken());
int inStock = Integer.parseInt(st.nextToken());
int minStock = Integer.parseInt(st.nextToken());
int maxStock = Integer.parseInt(st.nextToken());
String company=st.nextToken();
item = new OutsourcedPart(id, name, price, inStock, minStock, maxStock, company);
}
return item;
}

public void readProducts(){
//ClassLoader classLoader = InventoryRepository.class.getClassLoader();
File file = new File(filename);

ObservableList<Product> listP = FXCollections.observableArrayList();
BufferedReader br = null;
try {
br = new BufferedReader(new FileReader(file));
String line = null;
while((line=br.readLine())!=null){
Product product=getProductFromString(line);
if (product!=null)
listP.add(product);
}
br.close();
} catch (IOException e) {
e.printStackTrace();
}
inventory.setProducts(listP);
}

private Product getProductFromString(String line){
Product product=null;
if (line==null|| line.equals("")) return null;
StringTokenizer st=new StringTokenizer(line, ",");
String type=st.nextToken();
if (type.equals("P")) {
int id= Integer.parseInt(st.nextToken());
inventory.setAutoProductId(id);
String name= st.nextToken();
double price = Double.parseDouble(st.nextToken());
int inStock = Integer.parseInt(st.nextToken());
int minStock = Integer.parseInt(st.nextToken());
int maxStock = Integer.parseInt(st.nextToken());
String partIDs=st.nextToken();

StringTokenizer ids= new StringTokenizer(partIDs,":");
ObservableList<Part> list= FXCollections.observableArrayList();
while (ids.hasMoreTokens()) {
String idP = ids.nextToken();
Part part = inventory.lookupPart(idP);
if (part != null)
list.add(part);
}
product = new Product(id, name, price, inStock, minStock, maxStock, list);
product.setAssociatedParts(list);
}
return product;
}

public void writeAll() {

//ClassLoader classLoader = InventoryRepository.class.getClassLoader();
File file = new File(filename);

BufferedWriter bw = null;
ObservableList<Part> parts=inventory.getAllParts();
ObservableList<Product> products=inventory.getProducts();

try {
bw = new BufferedWriter(new FileWriter(file));
for (Part p:parts) {
System.out.println(p.toString());
bw.write(p.toString());
bw.newLine();
}

for (Product pr:products) {
StringBuilder line = new StringBuilder(pr.toString() + ",");
ObservableList<Part> list= pr.getAssociatedParts();
int index=0;
while(index<list.size()-1){
line.append(list.get(index).getPartId()).append(":");
index++;
}
if (index==list.size()-1)
line.append(list.get(index).getPartId());
bw.write(line.toString());
bw.newLine();
}
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}

public void addPart(Part part){
inventory.addPart(part);
writeAll();
}

public void addProduct(Product product){
inventory.addProduct(product);
writeAll();
}

public int getAutoPartId(){
return inventory.getAutoPartId();
}

public int getAutoProductId(){
return inventory.getAutoProductId();
}

public ObservableList<Part> getAllParts(){
return inventory.getAllParts();
}

public ObservableList<Product> getAllProducts(){
return inventory.getProducts();
}

public Part lookupPart (String search){
return inventory.lookupPart(search);
}

public Product lookupProduct (String search){
return inventory.lookupProduct(search);
}

public void updatePart(int partIndex, Part part){
inventory.updatePart(partIndex, part);
writeAll();
}

public void updateProduct(int productIndex, Product product){
inventory.updateProduct(productIndex, product);
writeAll();
}

public void deletePart(Part part){
inventory.deletePart(part);
writeAll();
}
public void deleteProduct(Product product){
inventory.removeProduct(product);
writeAll();
}

public Inventory getInventory(){
return inventory;
}

public void setInventory(Inventory inventory){
this.inventory=inventory;
}
}
Reply all
Reply to author
Forward
0 new messages