2016-05-13 6 views
0

Ich bin mit einem seltsamen Problem in Spring Boot Testfall konfrontiert. Ich habe alles versucht, was ich finden konnte, aber kein Glück. Kann mir jemand helfen.Spring Boot - Konfiguration lädt nicht in Junit Test

Wenn ich die Spring Boot App laufe funktioniert alles gut. Der Testfall lädt jedoch nicht die partnerConfig-Eigenschaften (Es lädt andere Eigenschaften, aber nicht partnerConfig). Wenn Sie einen Hinweis haben, bitte ping mich.

Yaml Datei

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

Wenn ich die Feder Boot-App funktioniert alles einwandfrei laufen. Der Testfall lädt jedoch nicht die partnerConfig-Eigenschaften (Es lädt andere Eigenschaften, aber nicht partnerConfig). Wenn Sie einen Hinweis haben, bitte ping mich.

+0

Was mag es 'MainMethodRunner' aussehen? –

+0

@SpringBootApplication public class MainMethodRunner { public static void main (String [] args) { ConfigurableApplicationContext run = SpringApplication.run (MainMethodRunner.class, args); }} – user2599739

Antwort

0

Zugabe von Getter und Setter für HashMap den Test bestanden

+1

Könnten Sie bitte auf Ihre Antwort antworten, um zukünftigen Benutzern, die ähnliche Probleme haben könnten, am besten zu helfen? Es wäre großartig, wenn Sie eine Erklärung geben und vielleicht etwas Code zeigen könnten! – Bono

0

Dies ist, was schließlich für mich gearbeitet hat:

yaml Datei

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" 

ich eine Klasse wollte die parterConfig Eigenschaften dynamisch abbildet (ohne Schlüssel mit @Value zu codieren) Weil ich die Fähigkeit haben wollte, wo wir mehr partnerConfigs hinzufügen können, und es keine Codeänderung erfordern sollte.

PartnerConfig Klasse, die Eigenschaften der Klasse abbildet

@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); 
    } 


} 

und Unit-Test sah aus wie

@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

Dies ist ein Integrationstest, kein Unit-Test;) Sie könnten die Konfigurationsdaten nicht innerhalb eines Unit-Tests laden. Ich nehme an, dass Ihr ursprüngliches Problem auch in Ihrem Produktionscode enthalten sein sollte? AFAIK '@ConfigurationProperties' funktioniert nur mit sichtbaren Feldern, entweder müssen Sie Provider' Getters/Setter' bereitstellen oder die Felder 'public' machen. –