Ski*_*rou 6 java junit unit-testing mockito quarkus
我正在尝试使用 Mockito 为 Quarkus 编写单元测试,但我无法模拟事物。
\n这是一个最小的(不是)工作示例\xe2\x80\xaf:
\npackage 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}\nRun Code Online (Sandbox Code Playgroud)\n测试在 NullPointer 上崩溃。
\n@RunWith(MockitoJUnitRunner.class)我读到这些问题可以通过用,注释测试来解决@ExtendWith(MockitoExtension.class)(由于某种原因我希望@QuarkusTest无论如何\xe2\x80\xaf?),但是我无法找到正确的导入来加载它们。
我尝试了各种变体org.junit.jupiter.api.MockitoExtension,org.junit.runner.RunWith但没有成功。
这是我的 \xe2\x80\xaf 的相关部分pom.xml:
<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>\nRun Code Online (Sandbox Code Playgroud)\n我缺少什么\xe2\x80\xaf?
\n我认为原始代码适用于普通风格的模拟\xe2\x80\xaf:
\nFoobar foobar = Mockito.mock(Foobar.class);\nRun Code Online (Sandbox Code Playgroud)\n所以问题实际上是如何让@Mock注释起作用\xe2\x80\xaf? \xe2\x80\xaf 需要一些东西:
该@RunWith注释已在 JUnit5 中被替换(或者我们应该说升级)@ExtendWith。可以使用 导入到 Quarkus 中import org.junit.jupiter.api.extension.ExtendWith;。
@RunWith通常用作@ExtendWith(MockitoExtension.class). MockitoExtension 可以使用 导入到 Quarkus 中import org.mockito.junit.jupiter.MockitoExtension;。 请注意,mockito-junit-jupiter依赖项(来自org.mockito组)必须添加到pom.xml,因为quarkus-junit5-mockito包不依赖于它。
模拟必须在MockitoAnnotations.initMocks()测试之前初始化。请注意,虽然使用 setup 函数似乎更有意义@BeforeAll,但显然这不是这个注释的重点,应该使用@BeforeEach(前者需要 setup 是静态的,并且 IIUC setup 函数将在每个之前调用)无论如何都要测试)。
最后@Mock注释应该可以工作。
总而言之,原始代码将变为\xe2\x80\xaf:
\npackage 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}\nRun Code Online (Sandbox Code Playgroud)\n在 \xe2\x80\xaf中添加以下内容pom.xml:
<dependency>\n <groupId>org.mockito</groupId>\n <artifactId>mockito-junit-jupiter</artifactId>\n <scope>test</scope>\n</dependency>\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
5752 次 |
| 最近记录: |