【问题标题】:How do i initiate Spring @Autowired instances when running a Cucumber test?运行 Cucumber 测试时如何启动 Spring @Autowired 实例?
【发布时间】:2019-12-24 09:43:43
【问题描述】:

我可以在调试 StepDefinitions.java 时启动 Spring,但是从 gradle 运行测试会产生 null。我需要额外的胶水吗?

产生空值:gradle cucumber

产生空值:运行 myFeature.features

产生 myService(工作):运行 Stepdefinitions.java

我已经尝试了以下代码:

@ContextConfiguration(
        classes = Application.class,
        loader = SpringBootContextLoader.class)
@WebAppConfiguration

当前步骤定义:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = Application.class)
@WebAppConfiguration
public class StepDefinitions{
    private static String roll;

   @Autowired
   MyService myService;


    /** Reset all static values before running test cases    */
    @BeforeClass
    public static void resetValues() {
        roll = "";
    }

    //I use swedish, "Given"
    @Givet("Jag har rollen {string}")
    public void getRole(String roll) {
        assertNotNull(roll);
        this.roll = roll;
        myService.useRole(roll);
    }
}

gradle.build:

dependencies {
compile files('../libs/cucumber-spring-4.7.1.jar')
testCompile 'io.cucumber:cucumber-java:' + cucumberVersion
testCompile 'io.cucumber:cucumber-junit:' + cucumberVersion
...
}

task cucumber() {
    dependsOn assemble, compileTestJava
    doLast {
        javaexec {
            main = "cucumber.api.cli.Main"
            classpath = configurations.cucumberRuntime + 
sourceSets.main.output + sourceSets.test.output
            args = ['--plugin', 'pretty', '--glue', 'steps/rufs', 
'src/test/resources/features', '--tags','@rufs']
            }
    }
}

【问题讨论】:

标签: java spring-boot gradle cucumber


【解决方案1】:

从 Gradle 运行时,您不会在任何地方参与 JUnit。 @RunWith 被 JUnit 使用,而这反过来又促使 Spring 参与其中。当 Cucumber 作为您的套件运行时,它会忽略这些注释,因为它不理解它们。

您需要使用 JUnit 作为您的套件(即不运行 cucumber.api.cli.Main)。然后你就会遇到问题,因为你需要使用两个“跑步者”:Cucumber 和 Spring。

解决这个问题的方法是 JUnit 针对其中一位跑步者的“规则”。 Spring 有一个规则,但据我所知 Cucumber 没有。在这种情况下,使用 Cucumber runner:

@RunWith(Cucumber.class)

结合 Spring 的规则,如下所述:How to run JUnit SpringJUnit4ClassRunner with Parametrized?

【讨论】:

  • @mpkorstanje @RunWith 是一个 JUnit 注释,他已经在他的代码中使用了它。如果您希望 Spring 与 Cucumber 集成,那么 JUnit 需要成为您的套件。这就是为什么当他从他的 IDE(即使用 JUnit 套件)运行测试时,它可以工作,但为什么从 Gradle(Cucumber 套件)运行测试却没有。
猜你喜欢
  • 2016-02-17
  • 1970-01-01
  • 2019-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多