0

工作CASE:我加載用戶對象@PostConstruct,並試圖讓角色任何測試方法的時候,我得到惰性初始模式例外,但是當裝載任何測試方法,然後讓角色的用戶對象,一切工作正常懶加載不@PostConstruct

需要量:我希望能夠讓懶惰初始化在測試方法正常工作,而不需要在每個測試方法加載的對象,也沒有在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); 

    } 



} 

回答

1

使用@Before而不是@PostConstruct

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

在違背@PostConstruct(從未在一個事務中運行,即使明確標有@Transactional),@Before@After方法總是參加一個測試(僅回滾)事務。

+0

它工作正常,但init方法需要公開,感謝您的快速回復。 –

+0

更正,C&P錯誤,謝謝。 –

0

它不會幫助。無論如何,JUnit框架爲每個測試方法構建了一個新對象,所以即使你確實得到了@PostConstruct來做你想做的事情,它也不會爲所有方法初始化一次。唯一的所有方法初始化是JUnits @BeforeClass這可能仍然不是你想要的,因爲它的靜態並且在彈簧初始化之前運行。你可以嘗試其他框架...