【问题标题】:Upgrade Mockito illegal reflective access operation升级 Mockito 非法反射访问操作
【发布时间】: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 是不可能回答的。

标签: java mockito


【解决方案1】:

尝试添加这个依赖

<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-inline</artifactId>
    <version>4.2.0</version>
</dependency>

另外,你的测试类有一些错误,你没有初始化 mocks,改一下吧:

public class SomeClassTest {

@Mock
private Authentication authentication;

@InjectMocks
private YourTestService yourTestService;

@BeforeEach
void setUp(){
  initMocks(this);
}

  @Test
  public void init() {

  //put test code
  }
}

【讨论】:

  • 您可能想添加一个小注释来解释为什么需要这种依赖关系。
  • 可以,但我想得到作者的反馈
  • 嗨@DmitriiBykov,添加此依赖项导致警告不再出现,但我认为我真正的问题是我收到空指针异常。我不确定为什么这些测试在 java 8 上运行没有问题。我已编辑我的帖子以显示我的问题的示例。
  • 我尝试添加 initMocks 和 openMocks,因为 initMocks 已被弃用。不工作。我认为当您使用 @RunWith(MocktioJunitRunner.class) 时,它已经处理了所有这些。在调试中,我可以看到我的模拟正在初始化,但是我上面引用的那个由于某种原因在我的 setUp 方法中的模拟方法调用上失败了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-24
  • 2021-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-02
  • 1970-01-01
相关资源
最近更新 更多