当前位置: 首页 > 知识库问答 >
问题:

“绕过”Quarkus单元测试中的模拟

赫连晋
2023-03-14

我有一个Quarkus项目,我将大部分业务逻辑放在服务中,也就是使用@ApplicationScoped注释的可注入bean中,所有CRUD操作都在其中进行。在JAX-RS资源文件本身中,大部分逻辑只是验证,通常使用整个验证bean。这意味着我们需要在测试资源时模拟注入的服务,以防止单元测试成为本质上的集成测试。我们这样做有这样一个结构(示例项目);

文件模拟欢迎服务。java又是这样的:

import io.quarkus.test.Mock;

import javax.enterprise.context.ApplicationScoped;

@Mock
@ApplicationScoped
public class MockGreetingService extends GreetingService {

    @Override
    public String sayHello(String name) {
        return String.format("Hello %s, your id is %s", name, "1234");
    }
}

我们的实际项目比这更复杂一点,因为模拟总是返回我们的DTO类,而不管输入如何,但是原理和上面一样。它们完美地用于我们的JAX-RS资源测试。然而,试图测试实际的服务bean本身意味着这个设置有问题。我构建了一个服务测试,它使用与下面代码相同的注释和流程:

import io.quarkus.test.junit.QuarkusTest;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

import javax.inject.Inject;

@QuarkusTest
public class GreetingServiceTest {

    @Inject
    GreetingService greetingService;

    @Test
    void checkReturnsHello () {

        String result = greetingService.sayHello();
        System.out.println(result);
        Assertions.assertEquals("hello Martin! Your country is Italy", result);
    }
}

有了上面类中的依赖注入(我们在资源测试中没有这样做),我希望Quarkus理解我们希望在这个测试中使用原始服务。我真傻。一个简单的日志显示,模拟服务方法确实仍在上面的后一个测试中运行。

现在我想知道——这是在后一个测试中禁用模拟的方法吗?最好不要修改或删除模拟类,尽管我意识到这可能不可能像我想象的那样。提前谢谢!

共有1个答案

邬楚青
2023-03-14

听起来像是限定符的用例,它使您能够拥有不同的实现bean,并在注入点选择您喜欢的bean类型:https://jakarta.ee/specifications/cdi/2.0/cdi-spec-2.0.html#qualifiers

作为一种选择,您也可以决定自己实例化您的服务,而不是以任何方式使用cdi。

 类似资料:
  • 我要从Thorntail搬到Quarkus。在我的测试中,我曾创建一个@deployment方法,在该方法中,我只放置测试所需的内容。特别是,我没有把一个类放在@Startup注释中(因为我不想测试它…)。当我移动到QUARKUS时,我抑制了de@deployment静态方法,然后当我启动测试时@Startup是。。。一开始,发生了很多不好的事情,阻止我测试我想要测试的东西(好吧,它崩溃了,因为它

  • 我面临一个问题,而嘲笑jUnit测试的东西。 情况如下: 类A实现了来自第三方jar的接口,并且需要实现method1。除了method1之外,A还包含method2,它是从method1调用的。method2本身调用一些外部服务。 我想单元测试方法1。 方法1接受输入,比如X。X有一个包裹在里面的输入变量,比如var1。var1由方法1中的逻辑使用,方法1在X中设置另一个变量,比如var2。 所

  • 我在尝试包装我的代码以用于单元测试时遇到了一些问题。问题是。我有接口IHttpHandler: 现在很明显,我将在Connection类中有一些方法,这些方法将从my后端检索数据(JSON)。但是,我想为这个类编写单元测试,显然我不想编写针对真实后端的测试,而是一个被嘲弄的测试。我曾尝试谷歌一个很好的答案,但没有很大的成功。我以前可以并且曾经使用过Moq来模拟,但是从来没有在像HttpClient

  • 我用Mockito进行了Java测试: Kotlin.TypeCastException:null不能强制转换为非null类型java.util.HashMap 如何正确模拟属性?

  • 问题内容: 我正在为启动a 并使用返回的诺言执行一些逻辑的控制器编写单元测试。我可以测试触发$ modal的父控制器,但是我一生无法弄清楚如何模拟成功的诺言。 我尝试了多种方法,包括使用和强制履行承诺。但是,我得到的最接近的结果是与本 SO帖子中的最后一个答案相似的东西。 我已经在“旧的” 模式中看到了几次这样的问题。在“新” 模式下,我找不到太多的方法。 一些指针将不胜感激。 为了说明问题,我使

  • 我在Dart类中有一个方法,它接受< code>BuildContext参数,如下所示: 我想测试该方法是否按预期工作: 当然,它不起作用,因为方法 需要一个参数 类型。此值在整个应用程序本身中都可用,但不确定在我的单元测试中从何处获取该值。