Cucumber/Spring不注入bean

问题描述 投票:0回答:1

我被困了三天,离它的工作只有一步之遥,这真的很令人沮丧。希望有人能帮我解封。

我正在构建一个集成以下库的独立 jar:

        <dependency>
            <groupId>jakarta.inject</groupId>
            <artifactId>jakarta.inject-api</artifactId>
        </dependency>
        <dependency>
            <groupId>io.cucumber</groupId>
            <artifactId>cucumber-java</artifactId>
        </dependency>
        <dependency>
            <groupId>io.cucumber</groupId>
            <artifactId>cucumber-spring</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </dependency>

我的胶水类看起来像这样:


import io.cucumber.java.en.Given;
import io.cucumber.spring.CucumberContextConfiguration;
import jakarta.inject.Inject;
import jakarta.inject.Named;
import java.util.concurrent.atomic.AtomicInteger;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;

@CucumberContextConfiguration
@ContextConfiguration("classpath:spring.main.xml")
public class MyStepDefinitions {

    private static final Logger LOGGER = LoggerFactory.getLogger(Dhis2StepDefinitions.class);

    @Inject
    @Named("testAtomicInt")
    @Autowired
    private AtomicInteger testCounter;
    

    @Given("I have {int} cukes in my belly")
    public void i_have_n_cukes_in_my_belly(int cukes) {
        testCounter.addAndGet(cukes);
        LOGGER.info("TEST: <{}> <{}> <{}>", cukes, testCounter, this);
    }

}

您会注意到有多个用于注入的注释。这是因为它们都不起作用。

我的“spring.main.xml”不只包含一个bean:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns=removed_urls_to_make_the_spam_filter_happy
       ">
         
    <bean id="testAtomicInt" class="java.util.concurrent.atomic.AtomicInteger" />                                
                                             
</beans>

我不能只依赖我的 bean 的注释,因为我们有一个广泛的 spring.xml 资源框架,我们可以包含这些资源来轻松、简单地实例化各种对象,例如数据库连接和与我们的应用程序相关的更复杂的对象。

我正在使用标准的黄瓜主类来启动我的测试:io.cucumber.core.cli.Main

似乎工作得很好:

  • 它正在运行测试并生成我的报告
  • 它加载我的 spring.main.xml 并实例化我的 bean(调试 o.s.b.f.s.DefaultListableBeanFactory - 创建单例 bean 'testAtomicInt' 的共享实例)

只不过它没有注入任何东西。

 Given I have 1 cukes in my belly # org.rtsl.dhis2.cucumber.definitions.Dhis2StepDefinitions.i_have_n_cukes_in_my_belly(int) java.lang.NullPointerException: Cannot invoke "java.util.concurrent.atomic.AtomicInteger.addAndGet(int)" because "this.testCounter" is null at org.rtsl.dhis2.cucumber.definitions.Dhis2StepDefinitions.i_have_n_cukes_in_my_belly(Dhis2StepDefinitions.java:27) at ✽.I have 1 cukes in my belly(file:///Users/ademarcq/repo/rtsl_utils/rtsl_util/CommonUtils/Dhis2CucumberTestTool/./src/test/resources/local_tests/scenarios/dummy.feature:7)

我做错了什么?

我尝试了任何单个注释进行注入。没有一个有效。

java spring cucumber cucumber-jvm cucumber-java
1个回答
0
投票

我找到了解决方案。发布它以防对某人有帮助。

我只需将与 init 相关的注释移至不同的类即可:

import io.cucumber.spring.CucumberContextConfiguration;
import org.springframework.test.context.ContextConfiguration;

@CucumberContextConfiguration
@ContextConfiguration("classpath:spring.main.xml")
public class Dhis2ContextConfig {

}

此外,它还有助于将豆子的范围更改为黄瓜胶

<bean id="testAtomicInt" class="java.util.concurrent.atomic.AtomicInteger" scope="cucumber-glue"/>     

这非常简单。

© www.soinside.com 2019 - 2024. All rights reserved.