我开始在Junit 4.12,Java EE中使用Mockito,我需要在CQRS程序中测试这个服务方法,我想模拟UserDAO(我们正在处理用户),然后Assert一些属性。
这是我到目前为止所做的:
@RunWith(MockitoJUnitRunner.class)
public class UserCommandServiceTest {
@InjectMocks
private UserCommandService userCommandService;
@Mock
private UserDAO userDAO;
@Before
public void init() {
MockitoAnnotations.initMocks(this);
}
@Test
public void testCreation() throws Exception {
User test = new User();
test.setUsername("test_username");
Mockito.when(userDAO.findById(Mockito.anyInt())).thenReturn(test);
assertEquals(0, 0);
}
}
字符串
问题不在于测试本身(正如你所看到的,有一个AssertEquals(0,0)),而是它没有运行,当我模拟DAO时,它给了我ExceptionInInitializer
,我不知道发布DAO代码是否有用,但它只是一个简单的CRUD类,带有JPA注解。
在这里,我发布了完整的跟踪:
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:276)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
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 @224edc67
at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:357)
at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297)
at java.base/java.lang.reflect.Method.checkCanSetAccessible(Method.java:199)
at java.base/java.lang.reflect.Method.setAccessible(Method.java:193)
at org.mockito.cglib.core.ReflectUtils$2.run(ReflectUtils.java:57)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:312)
at org.mockito.cglib.core.ReflectUtils.<clinit>(ReflectUtils.java:47)
... 40 more
型
我正在使用mockito 1.10.19。
2条答案
按热度按时间pgx2nnw81#
已解决
对于面临我的问题的人来说,解决方案是只使用这个maven依赖项:
字符串
avwztpqn2#
JDK迁移后Android Studio中的问题
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)
在迁移Java JDK 17之后,我在Android Studio中也遇到了这个问题,只需在app>build.gradle中添加下面的行
字符串
Gradle参考https://docs.gradle.com/enterprise/test-distribution/#accessing_jdk_internal_classes_from_your_tests