2016-05-13 23 views
0

私は春のブートテストケースで奇妙な問題に直面しています。私は見つけることができるすべてを試みたが運がない。誰かが私を助けることができますか?春のブート - junitテストで設定が読み込まれない

私がスプリングブートアプリケーションを実行すると、すべて正常に動作します。しかし、テストケースはpartnerConfigプロパティをロードしません(他のプロパティを読み込みますが、partnerConfigはロードしません)。 ヒントがあれば私にpingしてください。

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

私は春ブーツアプリのすべてが正常に動作実行YAMLファイル。しかし、テストケースはpartnerConfigプロパティをロードしません(他のプロパティを読み込みますが、partnerConfigはロードしません)。 ヒントがあれば私にpingしてください。 HashMapのためにゲッターとセッターを追加

+0

のように見えた 'MainMethodRunner'はどのようなものが見えますか? –

+0

@SpringBootApplication パブリッククラスMainMethodRunner { パブリック静的無効メイン(文字列[] args){ ConfigurableApplicationContext実行= SpringApplication.run(MainMethodRunner.class、引数)。 }} – user2599739

答えて

0

+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でキーをハードコードすることなく)私は、partnerConfigをさらに追加できるべきで、コード変更を必要としない機能を望んでいたからです。クラス

@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'フィールドにします。 –

関連する問題