我被困了三天,离它的工作只有一步之遥,这真的很令人沮丧。希望有人能帮我解封。
我正在构建一个集成以下库的独立 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
它似乎工作得很好:
只不过它没有注入任何东西。
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)
我做错了什么?
我尝试了任何单个注释进行注入。没有一个有效。
我找到了解决方案。发布它以防对某人有帮助。
我只需将与 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"/>
这非常简单。