我正在尝试使用 Mockito 为 Quarkus 编写单元测试,但我无法模拟。
这是一个最小(非)工作示例:
package com.my.package;
import io.quarkus.test.junit.QuarkusTest;
import org.mockito.Mockito;
import org.mockito.Mock;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
@QuarkusTest
public class LoadCalculatorServiceTest {
public class Foobar {
public int baz;
public void setBaz(int baz) {
this.baz = baz;
}
public int getBaz() {
return this.baz;
}
}
@Mock
Foobar foobar;
// Foobar foobar = new Foobar(); // doesn’t work either
@Test
public void myTest() {
Mockito.when(foobar.getBaz()).thenReturn(4); // NullPointer
Assertions.assertEquals(4,foobar.getBaz());
}
}
测试在 NullPointer 上崩溃。我读到可以通过使用
@RunWith(MockitoJUnitRunner.class)
注释测试来解决此类问题。 , @ExtendWith(MockitoExtension.class)
(出于某种原因,我希望 @QuarkusTest
无论如何都会这样做?),但是我找不到正确的导入来加载它们。我试过
org.junit.jupiter.api.MockitoExtension
, org.junit.runner.RunWith
和变化,没有成功。这是我的
pom.xml
的相关部分: <dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-junit5</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-junit5-mockito</artifactId>
<scope>test</scope>
</dependency>
我错过了什么?
最佳答案
我想了原始代码适用于普通样式的模拟:
Foobar foobar = Mockito.mock(Foobar.class);
所以问题实际上是如何制作@Mock
注释工作?为此需要做几件事:@RunWith
注释已被 @ExtendWith
替换(或者我们应该说升级)在 JUnit5 中。可以使用 import org.junit.jupiter.api.extension.ExtendWith;
在 Quarkus 中导入它.@RunWith
通常用作 @ExtendWith(MockitoExtension.class)
.可以使用 import org.mockito.junit.jupiter.MockitoExtension;
在 Quarkus 中导入 MockitoExtension . 当心 mockito-junit-jupiter
依赖项(来自 org.mockito
组)必须添加到 pom.xml
, 自 quarkus-junit5-mockito
包裹do not depend on it .MockitoAnnotations.initMocks()
初始化在测试之前。请注意,尽管使用 @BeforeAll
似乎更有意义。对于setup函数,显然不是这个注解的重点,应该使用@BeforeEach
(前者需要设置是静态的,而 IIUC 无论如何都会在每次测试之前调用设置函数)。@Mock
注释应该有效。总而言之,原始代码将变为:
package com.my.package;
import io.quarkus.test.junit.QuarkusTest;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.junit.jupiter.MockitoExtension;
@QuarkusTest
@ExtendWith(MockitoExtension.class)
public class LoadCalculatorServiceTest {
public class Foobar {
public int baz;
public void setBaz(int baz) {
this.baz = baz;
}
public int getBaz() {
return this.baz;
}
}
@BeforeEach
public void setup() {
MockitoAnnotations.initMocks(this);
}
@Mock
Foobar foobar;
@Test
public void myTest() {
Mockito.when(foobar.getBaz()).thenReturn(4);
Assertions.assertEquals(4,foobar.getBaz());
}
}
对 pom.xml
添加以下内容:<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-junit-jupiter</artifactId>
<scope>test</scope>
</dependency>
关于java - 无法模拟 Quarkus、NullPointer 异常且找不到相关导入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64031910/