簡體   English   中英

嘗試為 Spring Boot App 的 Cucumber 集成測試加載不同的屬性?

[英]Trying to load different properties for cucumber integration test of Spring Boot App?

我正在嘗試使用黃瓜的不同屬性來為我的 Spring Boot 應用程序運行集成測試。 如果我使用主 Application 類中加載的默認屬性,我可以讓它運行。 但是,當我將 @TestPropertySource 指定到配置屬性的這個不同位置時,它仍然使用主 Application 類的應用程序上下文。 因此,測試執行時的應用程序上下文與應用程序在服務器上運行時的情況相同。 我不想要這個。

這是一個使用 Spring Boot 1.5.18、Cucumber 4.2.2 的與工作相關的 Web 應用程序。

目錄結構是 src/main/java 用於我的所有 java 類和包,src/main/resources 與 application.properties 和其他一些,具有環境日志記錄和安全屬性的根級文件夾。 然后我有 src/test/java 和我的黃瓜代碼和 src/test/resources 和我修改的 application.properties 文件,我想在測試執行時使用。 我還想為測試指定不同的環境、安全性、日志配置屬性文件。

這是我的 ApplicationTest.Java 類,我試圖在其中使用不同的屬性源。

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class, webEnvironment = 
SpringBootTest.WebEnvironment.RANDOM_PORT)
@TestPropertySource( value = 
{"file:${env.dir}/deploy/acceptance/config/env.properties",
    "file:${env.dir}/deploy/acceptance/config/AppConfig.properties",
    "file:${env.dir}/deploy/acceptance/security/auth.properties", 
"classpath:application-test.properties"})
public abstract class ApplicationTest {
    public ApplicationTest() {
}

這是我的 Cucumber4Test.Java 類

@RunWith(Cucumber.class)
@CucumberOptions(features = "src/test/resources", 
    plugin = {"pretty", "html:target/cucumber", 
"junit:target/reports/cucumber.json"}, glue = { "com.test.packages.cucumber" 
}, monochrome = true)

public class CucumberTest {

}

我不確定我在學習教程時是否遺漏了這些課程中的任何內容。 但正如我所說,如果我沒有在我的 ApplicationTest 類中設置任何屬性源,並在 eclipse 中將 CucumberTest.java 作為 junit 運行,或者運行 mvn clean install、mvn test 等,黃瓜測試將按預期執行。

我在這里搜索了很多問題,嘗試了很多東西,但似乎對我沒有任何作用。 在 Spring Boot 中用 @TestPropertySource 覆蓋 @PropertySource

在 SpringBoot 測試中加載不同的 application.yml

編輯:我認為 @TestPropertySource 不起作用的原因是由於以下原因:Spring 中的屬性源優先級。 當我在 src/test/java 中加載黃瓜時,它會加載我指定的那些屬性,但隨后它會在 src/main/java 文件夾中啟動應用程序。 這里加載了 Application.java 中的默認屬性。 Spring 文檔說最后加載的屬性優先,所以我的 TestPropertySource 在應用程序啟動時被覆蓋。

我的工作解決方案:我想讓黃瓜在與我們的構建和部署管道不同的工作中在 Jenkins 中運行。 但是找不到解決我的工作標准的配置和屬性的路徑和目錄結構的方法。 所以我做了什么:

1) 將我需要的屬性添加到 src/test/resources 中的類路徑中。

2)現在這有點hacky,但是src/test/java中的第二個Application.java,@Propertysources反映了我想要使用的屬性。

3) 在 jenkins 中,我在運行 mvn 測試之前執行預構建步驟。 這個 shell 只是將 src/test/java/package/with/Application.java 移動到 src/main/java/package/with/Application.java 中。 這會用不同的屬性覆蓋通常的 Application.java 類。

4) 運行 mvn 測試

5)利潤

這有效。

使用默認應用程序。

package cucumber.examples.spring.txn;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;

@SpringBootApplication
@EnableWebMvc
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

還有一些application.properties

key=App

然后運行:

package cucumber.examples.spring.txn;

import cucumber.api.junit.Cucumber;
import org.junit.runner.RunWith;

@RunWith(Cucumber.class)
public class RunCukesTest {
}

並使用此測試上下文配置

package cucumber.examples.spring.txn;

import cucumber.api.java.Before;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.TestPropertySource;

@SpringBootTest
@AutoConfigureMockMvc
public class CucumberContextConfiguration  {

    @Value("${key}")
    private String value;

    @Before
    public void setup_cucumber_spring_context(){
        // Dummy method so cucumber will recognize this class as glue
        // and use its context configuration.

        System.out.println("Property was " + value);
    }
}

將打印Property was App

@TestPropertySource("classpath:test.properties")CucumberContextConfiguration並創建一個test.properties文件,其中包含

key=Test

將打印Property was Test

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM