java - 无法模拟 Quarkus、NullPointer 异常且找不到相关导入

标签 java unit-testing junit mockito quarkus

我正在尝试使用 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/

    相关文章:

    java - 当我使用 break 时从 "for loop"获取字符串

    java - 如何快速将maven项目集成到docker中

    c++ - 数值回归测试

    java - jUnit 忽略来自基类的@Test 方法

    java - Android ListView 带有来自 URL 的自定义图标

    java - 如何访问Cassandra节点本地数据

    c# - MassTransit 4 单元测试消费者超时

    android - 尝试删除测试提供程序时提供程序 "gps"未知异常

    java - 在多个目录中触发多个 JUnit 测试

    java - @InjectMocks 属性不能调用 Mockito 的方法 thenReturn 吗?