2017-09-11 209 views
0

鑑於我有以下3種豆類:排除春季雲配置服務器

@Component 
public class ServiceConfig { 
    // This value is only available from the Spring Cloud Config Server 
    @Value("${example.property}") 
    private String exampleProperty; 

    public String getExampleProperty() { 
     return exampleProperty; 
    } 
} 

@Component 
public class S1 { 
    int i = 1; 
} 

@Component 
public class S2 { 

    @Autowired 
    S1 s1; 

} 

我希望能夠運行以下測試:

@RunWith(SpringRunner.class) 
@SpringBootTest 
public class S2Test { 

    @Autowired 
    S2 s; 

    @Test 
    public void t2() { 
     System.out.println(s.s1.i); 
    } 

} 

我有問題是因爲我想單獨測試S2類,並且因爲它使用@Autowired我在我的測試中必須有一個Spring上下文,但是當Spring上下文開始時,它會嘗試創建包含與@Value的bean的所有3個bean。由於此值僅在Spring Cloud Config Server中可用,因此上下文將無法創建,並出現錯誤:org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'serviceConfig': Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'example.property' in string value "${example.property}"

My Question is: How are properties read from Spring Cloud Config Server handled in the application when unit tests are run, observe in my test i dont even care about the config so I dont want to explicitly have to set a value in my test just for the context to be started?

+0

你用什麼作爲構建工具? Gradle還是Maven?還有別的嗎? – Pytry

+0

我正在使用Maven – user3139545

回答

1

有一些選項。

  1. 您可以創建測試配置文件。然後,您將需要創建application-test.ymlapplication-test.properties文件。在那裏,您可以爲example.property設置相同的值。在那裏,如果你想用test配置文件開始一些測試,你可以添加到你的測試類@ActiveProfiles("test")註釋。對於這些測試,test將啓動。

  2. 您可以通過輸入@Value("${example.property:SomeDefaultValue}")來設置example.property的默認值。如果找不到屬性,將會插入SomeDefaultValue

我建議第一種方法。您可以使用註釋設置適當的配置文件,然後您將確定哪個配置文件配置服務器將發送給您。

+0

這可能有效,但我個人不喜歡使用配置文件和屬性的默認值。如果屬性不存在,我更喜歡應用程序無法啓動。 – Pytry

+0

好的,但你的應用程序需要這個值,所以你需要以某種方式提供它。測試的正確配置文件是已知的實踐,我認爲(不同的數據源,例如測試),這就是爲什麼我會採取第一種方法。其實,我每天都這樣做。 –

+0

我只是說出了一個偏好,而不是批評:)我剛剛遇到太多錯誤隱藏的實例,因爲啓用了錯誤的配置文件或者因爲沒有提供預期的屬性。我不喜歡配置文件,特別是因爲它們可以對應用程序配置產生如此巨大的影響,而我更喜歡精細的方法。如果我需要一個屬性進行測試,我想將屬性包含在「src/test/resources/application.properties」文件中。如果我需要一個特殊的配置來測試,那麼我創建一個僅測試配置類。 – Pytry

1

我建議乾脆將 「spring.cloud.config.enabled」 假的 「的src /測試/資源/ application.properties」 和 「example.property」 添加一個測試值..

spring.cloud.config.enabled=false 
example.property=testvalue 

這很簡單,不會影響您的代碼庫。 如果需要,您還可以使用MOCK Web環境以及不包含這些bean的自定義測試應用程序配置。

@SpringBootTest(classes = TestOnlyApplication.class, webEnvironment = SpringBootTest.WebEnvironment.MOCK) 
+0

它工作正常,沒有spring.cloud.config.enabled = false,所以我刪除那一個 – user3139545

+0

很酷:)我只在單元測試中禁用它,因爲我不想他們連接到任何東西,但真的沒關係,如果它的工作:) – Pytry