无法使用 Quarkus 进行模拟,出现 NullPointer 异常并且找不到相关导入

Ski*_*rou 6 java junit unit-testing mockito quarkus

我正在尝试使用 Mockito 为 Quarkus 编写单元测试,但我无法模拟事物。

\n

这是一个最小的(不是)工作示例\xe2\x80\xaf:

\n
package com.my.package;\n\nimport io.quarkus.test.junit.QuarkusTest;\nimport org.mockito.Mockito;\nimport org.mockito.Mock;\nimport org.junit.jupiter.api.Assertions;\nimport org.junit.jupiter.api.Test;\n\n@QuarkusTest\npublic class LoadCalculatorServiceTest {\n\n    public class Foobar {\n        public int baz;\n        public void setBaz(int baz) {\n            this.baz = baz;\n        }\n        public int getBaz() {\n            return this.baz;\n        }\n    }\n\n    @Mock\n    Foobar foobar;\n    // Foobar foobar = new Foobar(); // doesn\xe2\x80\x99t work either\n\n    @Test\n    public void myTest() {\n        Mockito.when(foobar.getBaz()).thenReturn(4); // NullPointer\n        Assertions.assertEquals(4,foobar.getBaz());\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

测试在 NullPointer 上崩溃。

\n

@RunWith(MockitoJUnitRunner.class)我读到这些问题可以通过用,注释测试来解决@ExtendWith(MockitoExtension.class)(由于某种原因我希望@QuarkusTest无论如何\xe2\x80\xaf?),但是我无法找到正确的导入来加载它们。

\n

我尝试了各种变体org.junit.jupiter.api.MockitoExtensionorg.junit.runner.RunWith但没有成功。

\n

这是我的 \xe2\x80\xaf 的相关部分pom.xml

\n
    <dependency>\n      <groupId>io.quarkus</groupId>\n      <artifactId>quarkus-junit5</artifactId>\n      <scope>test</scope>\n    </dependency>\n    <dependency>\n      <groupId>io.quarkus</groupId>\n      <artifactId>quarkus-junit5-mockito</artifactId>\n      <scope>test</scope>\n    </dependency>\n
Run Code Online (Sandbox Code Playgroud)\n

我缺少什么\xe2\x80\xaf?

\n

Ski*_*rou 6

我认为原始代码适用于普通风格的模拟\xe2\x80\xaf:

\n
Foobar foobar = Mockito.mock(Foobar.class);\n
Run Code Online (Sandbox Code Playgroud)\n

所以问题实际上是如何让@Mock注释起作用\xe2\x80\xaf? \xe2\x80\xaf 需要一些东西:

\n
    \n
  1. @RunWith注释已在 JUnit5 中被替换(或者我们应该说升级@ExtendWith。可以使用 导入到 Quarkus 中import org.junit.jupiter.api.extension.ExtendWith;

    \n
  2. \n
  3. @RunWith通常用作@ExtendWith(MockitoExtension.class). MockitoExtension 可以使用 导入到 Quarkus 中import org.mockito.junit.jupiter.MockitoExtension;请注意mockito-junit-jupiter依赖项(来自org.mockito组)必须添加到pom.xml,因为quarkus-junit5-mockito不依赖于它

    \n
  4. \n
  5. 模拟必须在MockitoAnnotations.initMocks()测试之前初始化。请注意,虽然使用 setup 函数似乎更有意义@BeforeAll,但显然这不是这个注释的重点,应该使用@BeforeEach(前者需要 setup 是静态的,并且 IIUC setup 函数将在每个之前调用)无论如何都要测试)。

    \n
  6. \n
  7. 最后@Mock注释应该可以工作。

    \n
  8. \n
\n

总而言之,原始代码将变为\xe2\x80\xaf:

\n
package com.my.package;\n\nimport io.quarkus.test.junit.QuarkusTest;\nimport org.mockito.Mock;\nimport org.mockito.Mockito;\nimport org.mockito.MockitoAnnotations;\nimport org.junit.jupiter.api.BeforeEach;\nimport org.junit.jupiter.api.Assertions;\nimport org.junit.jupiter.api.Test;\nimport org.junit.jupiter.api.extension.ExtendWith;\nimport org.mockito.junit.jupiter.MockitoExtension;\n\n@QuarkusTest\n@ExtendWith(MockitoExtension.class)\npublic class LoadCalculatorServiceTest {\n\n    public class Foobar {\n        public int baz;\n        public void setBaz(int baz) {\n            this.baz = baz;\n        }\n        public int getBaz() {\n            return this.baz;\n        }\n    }\n\n    @BeforeEach\n    public void setup() {\n        MockitoAnnotations.initMocks(this);\n    }\n\n    @Mock\n    Foobar foobar;\n\n    @Test\n    public void myTest() {\n        Mockito.when(foobar.getBaz()).thenReturn(4);\n        Assertions.assertEquals(4,foobar.getBaz());\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

在 \xe2\x80\xaf中添加以下内容pom.xml

\n
<dependency>\n  <groupId>org.mockito</groupId>\n  <artifactId>mockito-junit-jupiter</artifactId>\n  <scope>test</scope>\n</dependency>\n
Run Code Online (Sandbox Code Playgroud)\n