Can I use spring to autowire controller in cucumber test?

前端 未结 3 1101
孤街浪徒
孤街浪徒 2021-02-01 22:54

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

相关标签:
3条回答
  • 2021-02-01 23:34

    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:

    @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:

    mvn -Denvironment=dev clean test
    

    the maven dependencies I have in my pom are:

    <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>
    
    0 讨论(0)
  • 2021-02-01 23:34

    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.

    In my case I got Spring Injection to work in my step definitions with the following added dependency.

    <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

    @RunWith(Cucumber.class)
    @CucumberOptions(format = { "pretty", "html:target/cucumber-html-report", "json:target/cucumber-json-report.json" })
    public class CukesRunner {}
    

    Cucumber.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 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>
    
    0 讨论(0)
  • 2021-02-01 23:47

    I used cucumber-jvm to autowire Spring into 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

    <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.

    @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

    @ContextConfiguration("classpath:cucumber.xml")
    public class CucumberStepDefs {
    
        @Autowired
        SpringDAO dao;
    
        @Autowired
        SpringService service;
    }
    
    0 讨论(0)
提交回复
热议问题