【发布时间】:2021-12-29 15:44:08
【问题描述】:
我正在将一个库从 Java 8 升级到 Java 11。我正在使用 Maven 3.8.x、Spring boot 2、Mockito-core 4.2.0。我收到以下警告消息:
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.mockito.internal.util.reflection.RefelectionMemberAccessor
在进行一些研究时,我发现了一些可能的解决方案,但似乎都没有奏效。我尝试在 arg 行中使用 --add-opens,将 Mockito 从 3.8.0 升级到 4.2.0,升级了 Byte Buddy。
注意:我不确定我是否正确使用了 --add-opens 参数。对于我的情况,<module>/<package>=VALUE 需要什么,我有点困惑。我以为我说得对,但它没有帮助。
我有其他微服务继承了这个库并在测试中使用了 Mockito,它们运行良好。在这些微服务中,我们覆盖了 java 版本并更新了这些项目的 pom 中的必要依赖项。
*** 这给了我一个空指针,但不知道为什么。在 java 8 上运行时,我在这些测试中没有得到空指针 *** 类测试失败示例:
@RunWith(MocktioJunitRunner.class)
public class SomeClassTest {
@Mock
private Authentication authentication;
@Before
public void init() {
Mockito.when(authentication.getDetails()).thenReturn(someReturn);
}
}
例外:
java.lang.NullPointerException
at java.base/java.lang.reflect.Method.getParameterTypes(Method.java:311)
at org.springframework.security.core.Authentication$MockitoMock$1943314113.getDetails(UnknownSource)
【问题讨论】:
-
这是警告而不是错误(从 Java 16 开始只会是错误)。
-
运行测试时崩溃了
-
如果在运行测试时出现崩溃,那么您可能关注的是错误的问题,因为非法反射访问警告不会导致这种情况(它只是一个警告,表明已完成某事会将来禁止使用)。发布minimal reproducible example 会有所帮助。
-
嗨@MarkRotteveel,我相信你在进一步检查时是正确的,我会在每次测试中得到一个空指针异常。它源于我拥有的 init 方法。尝试从 Authentication 类模拟方法时,如我上面的编辑所示。在 java 8 上运行时,我没有收到此异常。
-
没有minimal reproducible example 是不可能回答的。