отложенная загрузка не работает с @Postconstruct - PullRequest
0 голосов
/ 11 декабря 2011

CASE: я загружаю пользовательский объект в @ PostConstruct , и при попытке получить роли в любом методе тестирования ,я получаю исключение lazyinitialization , но когда загрузка пользователь объекта в любом методе тестирования и затем получение ролей, все работаетштраф .

ТРЕБОВАНИЕ: Я хочу, чтобы ленивая инициализация работала нормально в тестовых методах без необходимости загрузки объекта в каждом методе тестирования, а также без обходного путизагрузки коллекции в методе init, есть ли хорошее решение для такой проблемы в модульном тесте?

   @RunWith(SpringJUnit4ClassRunner.class)
   @ContextConfiguration(locations = {
      "classpath:/META-INF/spring/applicationContext.xml",
      "classpath:/META-INF/spring/applicationSecurity.xml" })
   @TransactionConfiguration(defaultRollback = true)
   @Transactional
   public class DepartmentTest extends
      AbstractTransactionalJUnit4SpringContextTests {

   @Autowired
   private EmployeeService employeeService;

   private Employee testAdmin;

   private long testAdminId;

   @PostConstruct
   private void init() throws Exception {

    testAdminId = 1;
    testAdmin = employeeService.getEmployeeById(testAdminId);

   }


   @Test
   public void testLazyInitialization() throws Exception {

    testAdmin = employeeService.getEmployeeById(testAdminId);
    //if i commented the above assignment, i will get lazyinitialiaztion exception on the following line.
    Assert.assertTrue(testAdmin.getRoles().size() > 0);

   }



 }

Ответы [ 2 ]

1 голос
/ 11 декабря 2011

Используйте @Before вместо @PostConstruct:

@org.junit.Before
public void init() throws Exception {
  testAdminId = 1;
  testAdmin = employeeService.getEmployeeById(testAdminId);
}

В отличие от @PostConstruct (который никогда не выполняется внутри транзакции, даже если явно помечены @Transactional), @Before и@After методы всегда участвуют в тестовой (только для отката) транзакции.

0 голосов
/ 11 декабря 2011

Это не поможет. Каркас JUnit создает новый объект для каждого метода тестирования в любом случае, поэтому, даже если вы получите @PostConstruct, чтобы выполнить то, что вы хотите, он не будет инициализироваться один раз для всех методов. Единственная инициализация метода - это JUnits @BeforeClass, который, вероятно, все еще не тот, который вы хотите, потому что он статический и запускается до весенней инициализации. Вы можете попробовать другие рамки ...

...