gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 14:11:18 25 4
gpt4 key购买 nike

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

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com