黄瓜与 Micronaut

2024-05-09

我正在尝试将 Cucumber 与 Micronaut 一起使用,但当我尝试将其与 Cucumber 一起使用时,@MicronautTest 注释根本不起作用(未注入 theApple - 请参阅下面的代码)。如果我在没有黄瓜的情况下运行它就可以了。您有这方面的经验吗?应该有效吗?

谢谢伊万

这些是课程

class1

import io.cucumber.junit.Cucumber;
import io.cucumber.junit.CucumberOptions;
import org.junit.runner.RunWith;

@RunWith(Cucumber.class)
@CucumberOptions(plugin = { "pretty" },
        features = "src/test/resources"
)
public class TheRunner {
}

2类

import io.cucumber.java.en.Given;
import io.cucumber.java.en.Then;
import io.cucumber.java.en.When;
import io.micronaut.context.annotation.Value;
import io.micronaut.test.annotation.MicronautTest;
import org.junit.jupiter.api.Test;

@MicronautTest
public class Steps {

    @Value("apple")
    private String theApple;

//  @Test
//  public void test() {
//     System.out.println("Value: " + theApple);
//  }

    @Given("some text")
    public void some_method_1() {
        System.out.println("Value: " + theApple);
    }

    @When("some text")
    public void some_method_2() {
    }

    @Then("an alarm is raised")
    public void some_method_3() {
    }

}

构建.gradle

dependencies {
    annotationProcessor platform("io.micronaut:micronaut-bom:$micronautVersion")
    annotationProcessor "io.micronaut:micronaut-inject-java"
    annotationProcessor "io.micronaut:micronaut-validation"
    implementation platform("io.micronaut:micronaut-bom:$micronautVersion")
    implementation "io.micronaut:micronaut-inject"
    implementation "io.micronaut:micronaut-validation"
    implementation "io.micronaut:micronaut-runtime"
    implementation "javax.annotation:javax.annotation-api"
    implementation "io.micronaut:micronaut-http-client"
    runtimeOnly "ch.qos.logback:logback-classic:1.2.3"
    testAnnotationProcessor platform("io.micronaut:micronaut-bom:$micronautVersion")
    testAnnotationProcessor "io.micronaut:micronaut-inject-java"
    testImplementation platform("io.micronaut:micronaut-bom:$micronautVersion")
    testImplementation "io.micronaut.test:micronaut-test-junit5"
    testImplementation "org.junit.jupiter:junit-jupiter-api:${junitVersion}"
    testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:${junitVersion}"
    testRuntimeOnly "org.junit.vintage:junit-vintage-engine:${junitVersion}"
    testImplementation "io.cucumber:cucumber-java:$cucumberVersion"
    testImplementation "io.cucumber:cucumber-junit:$cucumberVersion"
}

这是我与 Micronaut 绑定的 ObjectFactory 版本。到目前为止,它已经适用于我们项目中声明的所有 bean。

package com.myproject.libs.cucumber;

import lombok.extern.slf4j.Slf4j;

import io.cucumber.core.backend.ObjectFactory;
import io.micronaut.context.ApplicationContext;
import io.micronaut.runtime.server.EmbeddedServer;

/**
 * Will start an {@link EmbeddedServer} at the start then stop it at the end of <strong>each</strong> Scenario<br>
 * Will also use the {@link ApplicationContext} to resolve Glue beans
 */
@Slf4j
public final class MicronautObjectFactory implements ObjectFactory {

    private EmbeddedServer embeddedServer;

    @Override
    public void start() {
        log.info("#### Starting EmbeddedServer");
        embeddedServer = ApplicationContext.run(EmbeddedServer.class, "test", "cucumber");
    }

    @Override
    public void stop() {
        if (embeddedServer != null) {
            log.info("#### Stopping EmbeddedServer");
            embeddedServer.stop();
        }
    }

    @Override
    public <T> T getInstance(final Class<T> beanType) {
        return embeddedServer.getApplicationContext().getBean(beanType);
    }

    @Override
    public boolean addClass(final Class<?> aClass) {
        return true;
    }

}

你仍然需要

  • 在里面声明这个beanresources/META-INF/services/io.cucumber.core.backend.ObjectFactory带有简单行的文件com.myproject.libs.cucumber.MicronautObjectFactory
  • (可选)还添加文件resources/cucumber.properties有价值观
# Cucumber properties to be applied, even when running feature's scenario manually
# https://github.com/cucumber/cucumber-jvm/tree/main/junit-platform-engine#configuration-options
cucumber.publish.quiet=true
cucumber.plugin=json:build/reports/cucumber.json
cucumber.junit-platform.naming-strategy=long
cucumber.object-factory=com.myproject.libs.cucumber.MicronautObjectFactory
  • 并为了方便使用它,创建您自己的注释
package com.myproject.libs.cucumber;

import static io.cucumber.junit.platform.engine.Constants.JUNIT_PLATFORM_NAMING_STRATEGY_PROPERTY_NAME;
import static io.cucumber.junit.platform.engine.Constants.PLUGIN_PROPERTY_NAME;
import static io.cucumber.junit.platform.engine.Constants.PLUGIN_PUBLISH_QUIET_PROPERTY_NAME;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.junit.platform.commons.annotation.Testable;
import org.junit.platform.suite.api.ConfigurationParameter;
import org.junit.platform.suite.api.IncludeEngines;
import org.junit.platform.suite.api.SelectClasspathResource;
import org.junit.platform.suite.api.Suite;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Inherited
@Documented
@Testable
@Suite
@IncludeEngines("cucumber")
@SelectClasspathResource("features")
@ConfigurationParameter(key = PLUGIN_PROPERTY_NAME, value = "json:build/reports/cucumber.json")
@ConfigurationParameter(key = JUNIT_PLATFORM_NAMING_STRATEGY_PROPERTY_NAME, value = "long")
@ConfigurationParameter(key = PLUGIN_PUBLISH_QUIET_PROPERTY_NAME, value = "true")
public @interface MicronautCucumber {
}

请注意您需要的依赖项:

  • io.cucumber:黄瓜-java
  • io.cucumber:黄瓜-junit-平台-引擎
  • org.junit.platform:junit 平台套件
  • io.micronaut:micronaut-上下文
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

黄瓜与 Micronaut 的相关文章

随机推荐