Java 我可以在黄瓜测试中使用弹簧自动连接控制器吗?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/23564938/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Can I use spring to autowire controller in cucumber test?
提问by Billy Sneddon
I am using Cucumber to automate the testing of services and controllers in my app. In addition, I am using the Cucumber Junit runner @RunWith(Cucumber.class)
in the test steps. I need to instantiate my controller and was wondering if I could use Spring to autowire this. The code below shows what I want to do.
我正在使用 Cucumber 在我的应用程序中自动测试服务和控制器。此外,我@RunWith(Cucumber.class)
在测试步骤中使用了 Cucumber Junit 运行程序。我需要实例化我的控制器,并想知道我是否可以使用 Spring 来自动装配它。下面的代码显示了我想要做什么。
public class MvcTestSteps {
//is it possible to do this ????
@Autowired
private UserSkillsController userSkillsController;
/*
* Opens the target browser and page objects
*/
@Before
public void setup() {
//insted of doing it like this???
userSkillsController = (UserSkillsController) appContext.getBean("userSkillsController");
skillEntryDetails = new SkillEntryRecord();
}
采纳答案by Jewel
I used cucumber-jvm to autowire Spring into Cucumber.
我使用 Cucumber-jvm 将 Spring 自动装配到 Cucumber 中。
<dependency>
<groupId>info.cukes</groupId>
<artifactId>cucumber-core</artifactId>
<version>1.1.5</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>info.cukes</groupId>
<artifactId>cucumber-spring</artifactId>
<version>1.1.5</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>info.cukes</groupId>
<artifactId>cucumber-junit</artifactId>
<version>1.1.5</version>
<scope>test</scope>
</dependency>
And import applicationContext.xml into Cucumber.xml
并将 applicationContext.xml 导入 Cucumber.xml
<import resource="/applicationContext.xml" /> // refer to appContext in test package
<context:component-scan base-package="com.me.pos.**.it" /> // scan package IT and StepDefs class
In CucumberIT.java call @RunWith(Cucumber.class)
and add the CucumberOptions
.
在 CucumberIT.java 中调用@RunWith(Cucumber.class)
并添加CucumberOptions
.
@RunWith(Cucumber.class)
@CucumberOptions(
format = "pretty",
tags = {"~@Ignore"},
features = "src/test/resources/com/me/pos/service/it/" //refer to Feature file
)
public class CucumberIT { }
In CucumberStepDefs.java you can @Autowired
Spring
在 CucumberStepDefs.java 中,您可以使用@Autowired
Spring
@ContextConfiguration("classpath:cucumber.xml")
public class CucumberStepDefs {
@Autowired
SpringDAO dao;
@Autowired
SpringService service;
}
回答by DaddyMoe
In addition to Jewel's answer above do not forget to add in your own additional spring dependencies as "cucumber-spring" artifact seems to only provided the "Glue" between Cucumber and Spring.
除了上面 Jewel 的答案,不要忘记添加您自己的额外 spring 依赖项,因为“cucumber-spring”工件似乎只提供了 Cucumber 和 Spring 之间的“Glue”。
In my case I got Spring Injection to work in my step definitions with the following added dependency.
在我的情况下,我让 Spring Injection 在我的步骤定义中工作,并添加了以下依赖项。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<scope>test</scope>
</dependency>
..... Plus the rest of the cucumber dependencies
My Step Definition:
我的步骤定义:
@ContextConfiguration("/cucumber.xml")
@PropertySource("classpath*:qa-test.properties")
public class StepsDefinition {
@Autowired
private ServiceToInject serviceToInject;
}
CukesRunner
CukesRunner
@RunWith(Cucumber.class)
@CucumberOptions(format = { "pretty", "html:target/cucumber-html-report", "json:target/cucumber-json-report.json" })
public class CukesRunner {}
Cucumber.xml
黄瓜.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<import resource="classpath:applicationContext.xml"/>
</beans>
applicationContext.xml
应用上下文.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.mypackage"/>
<bean id="propertiesPlaceholder" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="qa-test.properties"/>
</bean>
---- rest of my beans
</beans>
回答by ttati
I just made cucumber and spring working with java based configuration and I think it is worth to share here. here what I have done:
我刚刚使用基于 Java 的配置制作了 Cucumber 和 Spring,我认为值得在这里分享。这里我做了什么:
@Configuration
@ComponentScan(basePackages = { "com.*" })
@PropertySource("classpath:application-${environment}.properties")
public class AppConfiguration {
@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
}
my step defintion class:
我的步骤定义类:
@ContextConfiguration(classes= AppConfiguration.class)
public class Stepdefs {
@Autowired
private MyBean mybean;
and here the test class:
这里是测试类:
@RunWith(Cucumber.class)
@CucumberOptions(format = { "pretty", "html:target/cucumber-html-report", "json:target/cucumber-json-report.json" })
@ContextConfiguration(classes= AppConfiguration.class)
public class RunCucumberTest {
}
and the maven command is:
Maven 命令是:
mvn -Denvironment=dev clean test
the maven dependencies I have in my pom are:
我在 pom 中的 maven 依赖项是:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<!--spring test-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-library</artifactId>
<version>${hamcrest.version}</version>
<scope>test</scope>
</dependency>
<!--cucumber -->
<dependency>
<groupId>info.cukes</groupId>
<artifactId>cucumber-java</artifactId>
<version>${cucumber.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>info.cukes</groupId>
<artifactId>cucumber-spring</artifactId>
<version>${cucumber.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>info.cukes</groupId>
<artifactId>cucumber-junit</artifactId>
<version>${cucumber.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>info.cukes</groupId>
<artifactId>cucumber-jvm</artifactId>
<version>${cucumber.version}</version>
<type>pom</type>
</dependency>