2016-05-13 128 views
0

我在春季啓動測試用例中遇到了一個奇怪的問題。我嘗試了所有我能找到但沒有運氣的東西。有人可以幫助我嗎?春季啓動 - 配置不在junit中加載測試

當我運行的春季啓動應用程序一切工作正常。但是測試用例不會加載partnerConfig屬性(它會加載其他屬性,但不會加載partnerConfig)。 如果您有任何提示,請ping我。

YAML文件

config: 
    MH: 
     partner.id: "441" 
     tiny.url.domain: "http://mh.local.upgrd.co/" 
    EY: 
     partner.id: "11" 
     tiny.url.domain: "http://ey.local.upgrd.co/" 

@Component 
@EnableConfigurationProperties 
@ConfigurationProperties() 
public class PartnerConfig { 
    private Map<String, Map<String, String>> config = new HashMap<>(); 
} 

@EnableAutoConfiguration 
@RunWith(SpringJUnit4ClassRunner.class) 
@SpringApplicationConfiguration(classes = {MainMethodRunner.class}) 
public class PartnerConfigTestIT { 
    @Autowired 
    PartnerConfig partnerConfig; 


    @Test 
    public void should_get_carrierCode_from_partnerId() { 
     //partnerConfig.config is not available in tests 
    } 
} 

當我運行的春天啓動的應用程序,一切工作正常。但是測試用例不會加載partnerConfig屬性(它會加載其他屬性,但不會加載partnerConfig)。 如果您有任何提示,請ping我。

+0

是什麼'MainMethodRunner'樣子? –

+0

@SpringBootApplication 公共類MainMethodRunner { 公共靜態無效的主要(字串[] args){ ConfigurableApplicationContext運行= SpringApplication.run(MainMethodRunner.class,參數); }} – user2599739

回答

0

添加getter和setter的HashMap的通過了測試

+1

可否請您詳細解答您的回答,以便爲可能遇到類似問題的未來用戶提供最好的幫助?如果你能給出一些解釋並且可能展示一些代碼,那將是非常好的! – Bono

0

這是爲我工作最後:

YAML文件

dynamodb: 
    endpoint: https://localhost:4311 
    accesskey: dummy 
    secretkey: dummy 

tinyurl: 
    key.length: 12 


partnerConfig: 
    DH: 
     partner.id: "056" 
     tiny.url.domain: "dh.test.upgrd.co" 
    HY: 
     partner.id: "2001" 
     tiny.url.domain: "hy.test.upgrd.co" 

我想要一類動態映射parterConfig性質(沒有使用@Value進行硬編碼)因爲我希望我們能夠添加更多的partnerConfigs,並且不需要更改代碼。

它映射屬性類

@Component 
@EnableConfigurationProperties 
@ConfigurationProperties 
public class PartnerConfig { 

    private static final String TINY_URL_DOMAIN = "tiny.url.domain"; 
    private static final String PARTNER_ID = "partner.id"; 

    private Map<String, Map<String, String>> partnerConfig = new HashMap<>(); 

    private BiMap<String, String> partnerIdToTinyUrlDomain = HashBiMap.create(); 

    @PostConstruct 
    private void initialize() { 
     partnerConfig.forEach((carrierCode, partnerConf) -> 
       partnerIdToTinyUrlDomain.put(partnerConf.get(PARTNER_ID), partnerConf.get(TINY_URL_DOMAIN))); 
    } 

    public String getPartnerId(String tinyUrlDomain) { 
     if (isEmpty(tinyUrlDomain)) 
      throwTinyUrlNotFoundError(tinyUrlDomain); 

     String partnerId = partnerIdToTinyUrlDomain.inverse().get(tinyUrlDomain); 
     if (isEmpty(partnerId)) 
      throwTinyUrlNotFoundError(tinyUrlDomain); 

     return partnerId; 
    } 

    public String getTinyUrlDomain(String partnerId) { 
     if (isEmpty(partnerId)) 
      throwPartnerNotFoundError(partnerId); 

     String tinyUrlDomain = partnerIdToTinyUrlDomain.get(partnerId); 
     if (isEmpty(tinyUrlDomain)) 
      throwPartnerNotFoundError(partnerId); 

     return tinyUrlDomain; 
    } 

    public void setPartnerConfig(Map<String, Map<String, String>> partnerConfig) { 
     this.partnerConfig = partnerConfig; 
    } 

    public Map<String, Map<String, String>> getPartnerConfig() { 
     return partnerConfig; 
    } 

    private String throwTinyUrlNotFoundError(String tinyUrlDomain) { 
     String msg = String.format("tiny url mapping not found for domain %s", tinyUrlDomain); 
     throw new TinyUrlNotFoundException(msg); 
    } 

    private String throwPartnerNotFoundError(String partnerId) { 
     String msg = String.format("partner %s is not configured", partnerId); 
     throw new PartnerConfigurationException(msg); 
    } 


} 

和單元測試PartnerConfig類看起來像

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringApplicationConfiguration(classes = {MainMethodRunnerTest.class}) 
@IntegrationTest 
public class PartnerConfigTestIT { 
    @Autowired 
    PartnerConfig partnerConfig; 

    @Test 
    public void getTinyUrlDomain_should_return_tinyUrlDomain_from_partnerId() { 
     assertEquals("hy.test.upgrd.co", partnerConfig.getTinyUrlDomain("2001")); 
    } 


} 
+0

這是一個集成測試,而不是單元測試;)您將無法在單元測試中加載配置數據。我假設你的原始問題也應該在你的產品代碼中加入? AFAIK'@ ConfigurationProperties'只能在可見字段上工作,因爲你需要提供'Getters/Setters'或者使這些字段成爲'public'。 –