当前位置: 首页 > 知识库问答 >
问题:

莫基托不能嘲笑17Java中的随机

窦志新
2023-03-14

试图将我的项目从Java 11更新到Java 17,在一个特定测试中,Mockito出现了一个意外错误。

mock(java.util.Random.class);

投掷

Feb 04, 2022 3:07:01 PM com.google.inject.internal.MessageProcessor visit
INFO: An exception was caught and reported. Message: java.lang.IllegalAccessException: class 
    net.bytebuddy.description.annotation.AnnotationDescription$ForLoadedAnnotation cannot access interface
    jdk.internal.util.random.RandomSupport$RandomGeneratorProperties (in module java.base) 
    because module java.base does not export jdk.internal.util.random to unnamed module @2f54a33d
org.mockito.exceptions.base.MockitoException: 
Mockito cannot mock this class: class java.util.Random.

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.2+8-86
JVM name           : OpenJDK 64-Bit Server VM
JVM version        : 17.0.2+8-86
JVM info           : mixed mode, sharing
OS name            : Mac OS X
OS version         : 12.1

不知道为什么Mockito这次考试不及格。

共有3个答案

鲍飞星
2023-03-14

将mokito升级到4.4.0它起作用了

西门山
2023-03-14

这里的问题是mockito(通过ByteBuddy)试图在运行时使用不可访问的类型(通过反射)。从Java 9开始,除非明确导出/打开模块,否则并非所有模块都可以访问。

由于这是一个运行时问题,您可以添加JVM arg/CLI选项来访问此类型。

根据此处的Oracle指南,-add打开后执行以下操作。

如果必须允许类路径上的代码进行深度反射以访问非公共成员,那么请使用--add opens运行时选项。

如果还想导出编译时可用的内部类型,可以使用“添加导出”。

要解决您的特定问题;使用以下内容。

添加打开java。基本/jdk。内部的util。随机=全部未命名

ALL-UNNAMED表示指定的包在整个代码库中可用。

然而,嘲笑不属于你的类型不是一个好的做法。也许,如果有替代方案,你可以简化它。

戴鸿羽
2023-03-14

这个特殊问题也可以通过以下方式解决:

mock(SecureRandom.class, withSettings().withoutAnnotations())
 类似资料:
  • 我是Mockito的新手,正在尝试模拟服务方法。但是,Mockito无法正确模拟函数。 以下是部分测试代码: 课程: 我期待返回一个非空列表。但是,它返回了一个空列表。有人能帮忙吗?

  • 我对莫基托有疑问。我想测试这个简单的类: 我写了这个简单的测试: 此测试运行时没有错误。我等待它没有编译,因为没有任何对userService方法的调用…

  • 我目前正在做一个小项目,作为Java测试课程的实习,我们试图看看mocking是如何工作的。 我们的目标是看到我们可以忽略我们所嘲笑的类中的错误。 正如您在Collaborateur中看到的,缺少一个“;”在System.Out之后,exercice的目标是表明嘲笑这个类可以让我们忽略这个错误。我的一些同事使用Eclipse时,使用“以JUnit形式运行”功能没有问题。 在Intellij中,我没

  • 我提到了这个答案,我该如何模拟java。时间本地日期。now()关于如何模拟我的LocalDateTime。now()调用。我基本上遵循了所有步骤,但只使用了LocalDateTime而不是LocalDate。 我的代码的功能是这样的,它应该只在一小时的第15或45分钟运行。因此,我将LOCAL\u DATE\u TIME静态变量设置为: 然后在我的@Before测试方法中,我有以下内容: 这是2

  • 问题内容: 我在带有打字稿的React Router v5.1.2中使用UseHistory挂钩吗?运行单元测试时,我遇到了问题。 TypeError:无法读取未定义的属性“ history”。 我也尝试使用,但仍然无法正常工作。 问题答案: 浅化使用的反应功能组件时,我需要相同的内容。 在我的测试文件中解决了以下模拟问题: