2015-08-11 3 views
0

Это said in manual, чтоСколько раз SpringJUnit4ClassRunner инициализирует контекст?

Тест аннотация говорит JUnit, что общественность аннулируется метод, к которому он присоединен может быть запущен в качестве тестового примера. Чтобы запустить этот метод, JUnit сначала создает новый экземпляр класса, затем вызывает аннотированный метод . Любые исключения, вызванные тестом, будут сообщены от JUnit как сбой. Если исключений не выбрасывают, то тест считается выполненным.

, что может означать, что для каждого метода @Test контекст должен быть инициализирован снова. Это также подтверждается в этом ответе: https://stackoverflow.com/a/1564309/258483

Одновременно я вижу напротив в моем эксперименте:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = SpringJUnit4ClassRunnerDemo._Config.class) 
public class SpringJUnit4ClassRunnerDemo { 


    public static class Bean1 { 
     { 
      System.out.println("Bean1 constructor called"); 
     } 
    } 

    public static class Bean2 { 

     { 
      System.out.println("Bean2 constructor called"); 
     } 

     private Bean1 bean1; 

     public Bean1 getBean1() { 
      return bean1; 
     } 

     @Autowired 
     public void setBean1(Bean1 bean1) { 
      this.bean1 = bean1; 

      System.out.println("Bean2.bean1 property set"); 
     } 
    } 

    @Configuration 
    public static class _Config { 

     @Bean 
     public Bean1 bean1() { 
      return new Bean1(); 
     } 

     @Bean 
     public Bean2 bean2() { 
      return new Bean2(); 
     } 


    } 

    @Autowired 
    private Bean1 bean1; 

    @Autowired 
    private Bean2 bean2; 


    @Test 
    public void testBean1() { 

     assertNotNull(bean1); 

     System.out.println("testBean1() done"); 
    } 

    @Test 
    public void testBean2() { 

     assertNotNull(bean2); 

     assertSame(bean2.getBean1(), bean1); 

     System.out.println("testBean2() done"); 
    } 


} 

Этот код выводит

Bean1 constructor called 
Bean2 constructor called 
Bean2.bean1 property set 
testBean1() done 
testBean2() done 

что может означать, что контекст не инициализируется во второй раз перед вторым тестом.

Что такое фактическое и правильное поведение и как его контролировать?

+2

Вашего понимание является неправильным, и вы читаете неправильную документацию. Структура контекста Spring Test заботится о загрузке контекста только один раз, по соображениям производительности, поскольку для загрузки контекста обычно требуется много времени. Если вы действительно хотите перезагрузить контекст, добавьте '@ DirtiesContext' в свои тестовые методы или тестовый класс. –

ответ

Смежные вопросы