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

Quarkus忽略测试的依赖关系

方心思
2023-03-14

在我的夸克应用程序中,我在一个单独的gradle项目/模块中实现了存储库,部分原因是我希望能够确保单元测试不使用数据库等。

问题是,如果我想在测试中使用任何注入的依赖项,我需要使用@QuarkusTest,然后构建或启动确保满足所有依赖项。

有没有一种方法不涉及模仿每一个外部依赖,例如。?

    < li >运行测试时,不要在构建或启动期间强制依赖关系,而是在运行时让它出错(如果被访问)。 < li >用模拟访问错误的方法来模拟所有不可用的依赖项(或它们的子集)。

共有1个答案

吴高峰
2023-03-14

我使用weld-junit在CDI组件上运行单元测试。过去我也一直使用cdiunit,这很棒,但是它不支持JUnit 5。两者的想法都是在一个真实的CDI容器中以最小的配置启动测试。重要的部分是您显式地控制哪些bean可用于注入,因此系统跳过了bean发现部分。这使得测试相当快:CDI开销只有几秒钟。这两个系统都允许您为任何您想要的依赖项提供模拟实例——我一直使用Mockito来管理模拟。

最小的 Maven 设置(请参阅此处,使用启用 JUnit 5 的 Maven surefire 插件版本,例如:

<pluginManagement>
    <plugin>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.22.2</version>
    <plugin>
</pluginManagement>

以及其他依赖关系:

        <dependency>
            <groupId>org.jboss.weld</groupId>
            <artifactId>weld-junit5</artifactId>
            <version>${version.weld-junit5}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>${version.junit.jupiter}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>${version.junit.jupiter}</version>
            <scope>test</scope>
        </dependency>
        <!-- If you want Mockito: -->
        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-core</artifactId>
            <version>${version.mockito}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-junit-jupiter</artifactId>
            <version>${version.mockito}</version>
            <scope>test</scope>
        </dependency>

有了这些,你就可以写了

// weld-junit5 annotation - there are other ways to activate weld-junit5
// in your tests, and more features for controlling the container,
// read the full docs!
@EnableAutoWeld
// add real bean implementations in the DI container
@AddBeanClasses(RealBeanDependency.class)
// add extensions if you need
@AddExtensions({Extension1.class, Extension2.class})
// activate scopes, if you need
@ActivateScopes(RequestScoped.class)
// add automatic creation of mocks with Mockito (@Mock)
@ExtendWith(MockitoExtension.class)
public class MyClassTest {
    // an example of introducing mocks to the DI container
    @Produces @Mock
    private ArticleService articleService;

    // injected the "System Under Test"
    // weld-junit will automatically add it to the available beans
    @Inject
    private MyClass sut;

    @Test
    void test() {
        // this runs inside the minimal CDI container
        // read the docs about details, e.g. it starts
        // a fresh container for each test (I think)
    }
}
 类似资料:
  • 我正在测试Quarkus应用程序,我想忽略一些测试。 测试类用,以及带有 我试图使用注释,但它不起作用,被忽略的测试无论如何都会执行。 这是代码: 有人知道我怎么才能做到这一点吗?

  • 根据我的理解,clean现在将调用clearVersionProperties,war将调用WriteVersionProperties。 但当我执行分级清洁时,Reactor计划看起来是这样的: 为什么要执行clearVersionProperties和writeVersionProperties任务,因为它们绑定到某些构建阶段?例如,不执行任务infoEnv,而是执行任务writeVersio

  • 有时,我们编写的代码并没有准备就绪,并且测试用例要测试该方法/代码是否失败(或成功)。 在本示例中,注释有助于禁用此测试用例。 如果使用注释在测试方法上,则会绕过这个未准备好测试的测试用例。 在本教程中,我们将演示如何使用来忽略测试方法。 创建一个Maven项目,其结构如下所示 - pom.xml 依懒包配置 - 创建一个测试类:TestIgnore.java,其代码如下所示 - 运行上面代码,得

  • 我对Symfony 4.2应用程序进行了许多边缘到边缘测试。这里我指的是使用测试客户端进行Web请求,然后对结果进行断言的测试。示例: 在此类测试中,是否有方法更改服务容器中的特定服务? 示例问题:我的服务通过名为的抽象来发出web请求。对于我的测试,我希望使用,这样就不会发出真正的web请求。我如何告诉Symfony使用此双重测试? 令人惊讶的是,在主测试留档中没有关于如何执行此基本测试任务的信

  • 有时,在运行测试用例时,我们的代码并没有完全准备就绪。 结果,测试用例失败。 @Ignore注释在这种情况下@Ignore帮助。 使用@Ignore注释的测试方法将不会被执行。 如果测试类使用@Ignore注释,则不会执行任何测试方法。 现在让我们看看@Ignore在行动。 创建一个类 (Create a Class) 在C:\“JUNIT_WORKSPACE中创建一个要测试的java类,比如Me

  • 我试图在自定义异常处理程序(用@ExceptionHandler和@ControllerAdvice注释)中的一个方法中返回“ResponseEntity”时遇到问题,我是从“doOnError”(rxjava)调用这个方法的,但我的问题是,当我这样做时,不仅调用了我的方法,还调用了@ControllerAdvice注释类中的另一个@ExceptionHandler,但该类不在我的项目中,而是在我