Это 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
что может означать, что контекст не инициализируется во второй раз перед вторым тестом.
Что такое фактическое и правильное поведение и как его контролировать?
Вашего понимание является неправильным, и вы читаете неправильную документацию. Структура контекста Spring Test заботится о загрузке контекста только один раз, по соображениям производительности, поскольку для загрузки контекста обычно требуется много времени. Если вы действительно хотите перезагрузить контекст, добавьте '@ DirtiesContext' в свои тестовые методы или тестовый класс. –