有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java测试Spring启动应用程序

有人知道我在哪里可以找到Cucumber通过Gradle测试Spring Boot应用程序的示例应用程序吗?我可以在cmd行上启动服务器并使用IDE来运行测试,但我需要能够在CI服务器上以编程方式运行所有测试。我在这里看到了答案,但该解决方案对我不起作用,很可能是因为我有多个step def文件

这是我的设置

建造。等级(在另一个问题中提到)

testCompile ("org.springframework.boot:spring-boot-starter-test",
    ...
    "info.cukes:cucumber-spring:${cucumberVersion}")

黄瓜试验。爪哇

@RunWith(Cucumber.class)
@CucumberOptions(format = "pretty", features = "src/test/resources")
public class CucumberTest{
}

抽象测试。java(由所有StepDef文件扩展)

@SpringApplicationConfiguration(classes = Application.class)
@RunWith(SpringJUnit4ClassRunner.class)
@Ignore
public abstract class AbstractSpringTest
{ ... }

它在启动时没有做正确的事情,因为它是1。正在尝试初始化我的step def文件和2。我的应用程序未启动,cucumber测试无法建立连接

谢谢

编辑:或者如果有人可以告诉我如何使用gradle启动和停止应用程序,这也是可以接受的


共 (5) 个答案

  1. # 1 楼答案

    我有一个类似的症状,我的黄瓜在春天不会启动

    事实证明,我忽略了(其中一个)以下依赖项:

    构建。格拉德尔

    testCompile "info.cukes:cucumber-junit:1.2.4"
    testCompile "info.cukes:cucumber-java:1.2.4"
    testCompile "info.cukes:cucumber-spring:1.2.4"
    

    StepDefs。java

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(
            loader = SpringApplicationContextLoader.class,
            classes = Application.class
    )
    @WebIntegrationTest(randomPort = true)
    public class StepDefs {
    
        @Value("${local.server.port}")
        int port;
    
    }
    

    更新:SpringBoot 1.5.1

    @ContextConfiguration(
            loader = SpringBootContextLoader.class,
            classes = Application.class
    )
    
  2. # 2 楼答案

    我在this question的帮助下解决了这个问题

    以下是答案的存储库: https://github.com/jakehschwartz/spring-boot-cucumber-example

    简而言之,AbstractSpringTest类需要有以下注释:

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(classes = DemoApplication.class, loader = SpringApplicationContextLoader.class)
    @WebAppConfiguration
    @IntegrationTest
    
  3. # 3 楼答案

    首先,您需要确保gradle中有applied spring-boot。调用gradle build,它将生成一个可运行的jar。不要将Spring类的清单调用作为主类,而是使用一个包装器,在线程中启动它,waits for it to settle down并运行Cucumber

    @RunWith(Cucumber.class)
    public class LucasePsCucumberTest implements Runnable {
        public static void main(String[] args) {
            Thread t = new Thread(this);
            t.start();
            // wait for t
            cucumber.api.cli.Main(null);
         }
    }
    
  4. # 4 楼答案

    我这样做是为了让Spring使用JUnit参数化测试。黄瓜的概念应该是一样的,但我还没试过。我使用的是XML配置,所以这可能会有所不同

    RunWithSpringJUnit4

    public abstract class RunWithSpringJUnit4 {
    
        private TestContextManager testContextManager;
    
        public RunWithSpringJUnit4() {
            try {
                this.testContextManager = new TestContextManager(getClass());
                this.testContextManager.prepareTestInstance(this);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    

    黄瓜测试

    @RunWith(Cucumber.class)
    @CucumberOptions(format = "pretty", features = "src/test/resources")
    public class CucumberTest extends RunWithSpringJUnit4 {
    }
    
  5. # 5 楼答案

    关于@jakehschwartz,如果您希望web应用程序在随机可用端口上启动,AbstractSpringTest需要:

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(classes = Application.class, loader = SpringApplicationContextLoader.class)
    @WebIntegrationTest({"server.port=0"})
    public abstract class AbstractSpringTest {
    
            @Value("${local.server.port}")
            protected int serverPort;
    ...}