0

My mock is version mockito-all-1.10.19. Java version "18" 2022-03-22 Junit version 4

interface UserDao .......................

package fita.application;

public interface UserDao {
    boolean createUser(String email);
}

interface UserService ...................

package fita.application;

public interface UserService {
    String createUser(String email);
}

Class UserServiceImpl

package fita.application;

public class UserServiceImpl implements UserService{
    private UserDao userDao;
    
    public UserServiceImpl(UserDao userDao) {
        this.userDao = userDao;
    }

    @Override
    public String createUser(String email) {
        boolean rs = this.userDao.createUser(email);
        return rs ? "SUCCESS" : "FAILED";
    }
    
}

My UserServiceImplTest class ..........................

package fita.junittest;

import org.junit.Assert;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.runners.MockitoJUnitRunner;

import fita.application.UserDao;
import fita.application.UserService;
import fita.application.UserServiceImpl;

@RunWith(MockitoJUnitRunner.class)
public class UserServiceImplTest {
    @Mock
    private UserDao userDao;
    private UserService userService;
    
    
    @Before
    public void setUp() throws Exception {
        userService = new UserServiceImpl(userDao);
    }

    @After
    public void tearDown() throws Exception {
        userService = null;
    }
    
    
    @Test
    public void createUser_WhenEmailExisted_ReturnFailed() {
        Mockito.when(userDao.createUser("thuanhieu02")).thenReturn(false);
        
        Assert.assertEquals("FAILED", userDao.createUser("thuanhieu02"));
    }
    
    @Test
    public void createUser_WhenEmailNotExisted_ReturnSuccess() {
        Mockito.when(userDao.createUser("thuanhieu03")).thenReturn(true);
        
        Assert.assertEquals("SUCCESS", userDao.createUser("thuanhieu03"));
    }
    
}

This is my failure trace:

java.lang.ExceptionInInitializerError
    at org.mockito.cglib.core.KeyFactory$Generator.generateClass(KeyFactory.java:167)
    at org.mockito.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25)
    at org.mockito.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:217)
    at org.mockito.cglib.core.KeyFactory$Generator.create(KeyFactory.java:145)
    at org.mockito.cglib.core.KeyFactory.create(KeyFactory.java:117)
    at org.mockito.cglib.core.KeyFactory.create(KeyFactory.java:109)
    at org.mockito.cglib.core.KeyFactory.create(KeyFactory.java:105)
    at org.mockito.cglib.proxy.Enhancer.<clinit>(Enhancer.java:70)
    at org.mockito.internal.creation.cglib.ClassImposterizer.createProxyClass(ClassImposterizer.java:95)
    at org.mockito.internal.creation.cglib.ClassImposterizer.imposterise(ClassImposterizer.java:57)
    at org.mockito.internal.creation.cglib.ClassImposterizer.imposterise(ClassImposterizer.java:49)
    at org.mockito.internal.creation.cglib.CglibMockMaker.createMock(CglibMockMaker.java:24)
    at org.mockito.internal.util.MockUtil.createMock(MockUtil.java:33)
    at org.mockito.internal.MockitoCore.mock(MockitoCore.java:59)
    at org.mockito.Mockito.mock(Mockito.java:1285)
    at org.mockito.internal.configuration.MockAnnotationProcessor.process(MockAnnotationProcessor.java:33)
    at org.mockito.internal.configuration.MockAnnotationProcessor.process(MockAnnotationProcessor.java:16)
    at org.mockito.internal.configuration.DefaultAnnotationEngine.createMockFor(DefaultAnnotationEngine.java:43)
    at org.mockito.internal.configuration.DefaultAnnotationEngine.process(DefaultAnnotationEngine.java:66)
    at org.mockito.internal.configuration.InjectingAnnotationEngine.processIndependentAnnotations(InjectingAnnotationEngine.java:71)
    at org.mockito.internal.configuration.InjectingAnnotationEngine.process(InjectingAnnotationEngine.java:55)
    at org.mockito.MockitoAnnotations.initMocks(MockitoAnnotations.java:108)
    at org.mockito.internal.runners.JUnit45AndHigherRunnerImpl$1.withBefores(JUnit45AndHigherRunnerImpl.java:27)
    at org.junit.runners.BlockJUnit4ClassRunner.methodBlock(BlockJUnit4ClassRunner.java:319)
    at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:63)
    at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)
    at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)
    at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:413)
    at org.mockito.internal.runners.JUnit45AndHigherRunnerImpl.run(JUnit45AndHigherRunnerImpl.java:37)
    at org.mockito.runners.MockitoJUnitRunner.run(MockitoJUnitRunner.java:62)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:93)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:40)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:529)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:756)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:452)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:210)
Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make protected final java.lang.Class java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain) throws java.lang.ClassFormatError accessible: module java.base does not "opens java.lang" to unnamed module @48140564
    at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:354)
    at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297)
    at java.base/java.lang.reflect.Method.checkCanSetAccessible(Method.java:200)
    at java.base/java.lang.reflect.Method.setAccessible(Method.java:194)
    at org.mockito.cglib.core.ReflectUtils$2.run(ReflectUtils.java:57)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:318)
    at org.mockito.cglib.core.ReflectUtils.<clinit>(ReflectUtils.java:47)
    ... 43 more


I try to search and find in gg, youtube but not find my issue.

  • Have you tried a newer version of Mockito? As far as I remember, 1.10.19 came out in 2011. I've never tried using it with Java 18, although I can't think of any good reason why it wouldn't work. – Dawood ibn Kareem Feb 04 '23 at 09:27
  • Fully agree with @DawoodibnKareem (and for why wouldn’t work with Java18, there’s this: https://stackoverflow.com/a/69388180/681444 ). Yes MavenCentral shows Mockito-all 1.10.19 came out in 2014 , and The Mockito site https://site.mockito.org/ states it has been discontinued, instead saying the “Recommended way of getting Mockito is declaring a dependency on “mockito-core” ” ( note “core “, NOT “all”). The latest version of core is 5.1.1. – racraman Feb 04 '23 at 09:58
  • Try adding `@InjectMocks` to UserService in your test class. – shanmukha vangaru Feb 04 '23 at 11:25
  • 2014, really? I thought it was way earlier than that. – Dawood ibn Kareem Feb 05 '23 at 01:12

1 Answers1

3

You have to upgrade the version of Mockito above 1.x. Different programmers described problems using Mockito 1.x with Java 11. And Mockito explained "JDK 11 is fully supported starting 2.23." And therefore newer JDK versions.

https://github.com/mockito/mockito-cglib/issues/1 (via https://shibboleth.atlassian.net/browse/JPAR-133)

Michael Katt
  • 615
  • 1
  • 5
  • 18