2015-11-19 2 views
0

Мы используем SpringJUnit4ClassRunner с ContextConfiguration аннотациями, например, тестирование переднего конца контроллера:Несколько конфигураций в Spring JUnit Test Class

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration 
public class FrontEndControllerTest { 

    private MockMvc mockMvc; 

    @Autowired 
    private FrontEndController frontEndController; 

    @Before 
    public void init() { 
     mockMvc = MockMvcBuilders.standaloneSetup(frontEndController).build(); 
    } 

    @Test 
    public void shouldDirectToSomeView() throws Exception { 
     mockMvc.perform(get("/")) 
       .andExpect(status().isOk()) 
       .andExpect(view().name("someView")); 
    } 

    @Configuration 
    public static class FrontEndControllerTestConfiguration { 

     @Bean 
     public FrontEndController defaultController() { 
      return // init controller 
     } 

     @Bean 
     public SomeConfigObject config() { 
      return // some config 
     } 
    } 
} 

Теперь я хочу добавить еще один тест с другой конфигурацией в этом же класс. Например, введите макет с операцией сбойной базы данных или или или.

Можно добавить еще один тест, как это (я знаю, не будет компилировать):

@Test 
@ContextConfiguration(/* My other configuration */) 
public void shouldDoSomeOtherStuff_InvalidConfiguration() { 
     // ... 
} 

Весной 4 не представляется возможным, потому что ContextConfiguration может быть объявлена ​​только аннотацию перед классом. Есть что-то вроде этого весной 4? Вы рекомендуете попробовать другой подход?

+0

Вы не можете. Вы должны создать другой тестовый класс с его собственным контекстом. –

+0

Вы рекомендуете другой подход? – Schrieveslaach

+0

Я могу указать на другой ответ, который я дал, который дает возможность настроить идеальную изоляцию теста (игнорируйте вопрос, мой ответ на самом деле не соответствует): http://stackoverflow.com/questions/33788771/could-not- resolve-placeholder-property-in-integration-test/33788901 # 33788901 –

ответ

0

Я нашел решение: проблема в том, что я хочу получать новые макеты для каждого теста, и я хочу их модифицировать, прежде чем выполнять mockMvc.perform(get("/")). Поэтому вы можете использовать аннотацию @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD). Вот мой код:

@ContextConfiguration 
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) 
@RunWith(SpringJUnit4ClassRunner.class) 
public class FrontEndControllerTest { 

    private MockMvc mockMvc; 

    @Autowired 
    private FrontEndController frontEndController; 

    @Autowired 
    private SomeConfigObject config; 

    @Before 
    public void init() { 
     mockMvc = MockMvcBuilders.standaloneSetup(frontEndController).build(); 
    } 

    @Test 
    public void shouldDirectToSomeView() throws Exception { 
     // mock valid behaviour of config 

     mockMvc.perform(get("/")) 
       .andExpect(status().isOk()) 
       .andExpect(view().name("someView")); 
    } 

    @Test 
    public void shouldNotDirectToSomeView_InvalidConfiguration() throws Exception { 
     // mock invalid behaviour of config 

     mockMvc.perform(get("/")) 
       .andExpect(status().is5xxServerError()) 
    } 

    @Configuration 
    public static class FrontEndControllerTestConfiguration { 

     @Bean 
     public FrontEndController defaultController() { 
      return // init controller 
     } 

     @Bean 
     public SomeConfigObject config() { 
      return mock(SomeConfigObject.class); 
     } 
    } 
} 
Смежные вопросы