0

ケース: @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);

   }



 }
4

2 に答える 2

1

@Beforeの代わりに使用@PostConstruct

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

@PostConstruct(明示的にマークされている場合でも、トランザクション内で実行されることはありません)とは@Transactional異なり、@Beforeメソッド@Afterは常にテスト(ロールバックのみ)トランザクションに参加します。

于 2011-12-11T15:41:52.637 に答える
0

それは役に立ちません。とにかく、JUnitフレームワークは各テストメソッドに対して新しいオブジェクトを構築するため、@PostConstructやりたいことができたとしても、すべてのメソッドに対して1回初期化されるわけではありません。唯一のすべてのメソッドの初期化は JUnits です@BeforeClass。これは、静的であり、春の初期化の前に実行されるため、おそらくまだ必要なものではありません。他のフレームワークを試すことができます...

于 2011-12-11T15:44:35.053 に答える