2016-08-19 70 views
12

在我的彈簧啓動應用程序中,我想在我的所有測試中覆蓋我的@Configuration類中的一個,並使用測試配置(特別是我的@EnableAuthorizationServer@Configuration類)。在每次彈簧啓動時覆蓋一個@Configuration類@Test

到目前爲止的spring boot testing featuresspring integration testing features概述沒有直接的解決方案浮出水面後:

  • @TestConfiguration:這是用於擴展,不重寫;
  • @ContextConfiguration(classes=…​)@SpringApplicationConfiguration(classes =…​)讓我重寫整個配置,而不僅僅是一個類;
  • @Test內的@Configuration類內建議覆蓋默認配置,但不提供任何示例;

有什麼建議嗎?

回答

15

內測試配置

爲測試內@Configuration的實施例:

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

    @Configuration 
    static class ContextConfiguration { 
     @Bean 
     @Primary //may omit this if this is the only SomeBean defined/visible 
     public SomeBean someBean() { 
      return new SomeBean(); 
     } 
    } 

    @Autowired 
    private SomeBean someBean; 

    @Test 
    public void testMethod() { 
     // test 
    } 
} 

類級別的註解@RunWith(SpringRunner.class)@SpringBootTest是彈簧引導1.4+,但內部的實施例即使對於使用@RunWith(SpringJUnit4ClassRunner.class)@SpringApplicationConfiguration@ContextConfiguration的舊版本,@Configuration仍然有效。

@Primary

@Primary註解的bean定義是確保這一具有優先權如果不止一個被發現。

可重複使用的測試配置

如果你想重用多個測試的測試配置,您可以定義使用Spring配置文件@Profile("test")一個獨立的配置類。然後,讓您的測驗班激活@ActiveProfiles("test")的檔案。查看完整的代碼:

@RunWith(SpringRunner.class) 
@SpringBootTests 
@ActiveProfiles("test") 
public class SomeTest { 

    @Autowired 
    private SomeBean someBean; 

    @Test 
    public void testMethod() { 
     // test 
    } 
} 

@Configuration 
@Profile("test") 
public class TestConfiguration { 
    @Bean 
    @Primary //may omit this if this is the only SomeBean defined/visible 
    public SomeBean someBean() { 
     return new SomeBean(); 
    } 
} 
+2

謝謝。我注意到我也可以通過在'src/test/java'上丟棄覆蓋'@ EnableAuthorizationServer'' @ Configuration'類來覆蓋所有測試中的類。 Spring引導規則:-) – NotGaeL

+0

作爲旁註,如果你只需要在特定的'@ Configuration'上改變一個值,而不是覆蓋它,你可以爲你的測試啓用一個特定的spring引導配置文件(例如命名爲'test')在你的測試類中使用註釋'@ActiveProfiles({「test」,...})。然後在你的'@ Configuration'上有一個簡單的'if(Arrays.asList(environment.getActiveProfiles())。contains(「test」))''。 – NotGaeL

+1

如果其他bean中有一個在內部使用,則由SomeBean類注入,您的解決方案將失敗。爲了使它工作,只需將ContextConfiguration類添加到SpringBootTest註釋使用的類的列表中。即:@SpringBootTest(classes = {Application.class,SomeTest.ContextConfiguration.class}) –

3

你應該使用spring boot profiles

  1. 標註您的測試配置與@Profile("test")
  2. @Profile("production")註釋您的生產配置。
  3. 在屬性文件中設置生產配置文件:spring.profiles.active=production
  4. @Profile("test")在測試類中設置測試配置文件。

所以當你的應用程序啓動時,它將使用「生產」類,當測試星將使用「測試」類。

如果使用內部/嵌套@Configuration類,它將被用來代替應用程序的主要配置。