2015-06-11 2 views
0

Я занимаюсь JUnit для проекта SSH. Во-первых, я встретил org.hibernate.LazyInitializationException, когда я применяю метод @Test. и я сделал некоторые исследования и решил это. Что я сделал - это добавить Setup и TearDown, которые использовали для привязки ресурса сеанса.Weird org.hibernate.LazyInitializationException when do JUNIT

Эти 2 способа, как это:

@Before 
public void setup(){ 
    System.out.println("Setup() running...."); 
    String filename = "WebContent\\WEB-INF\\classes\\applicationContext.xml"; 
    ctx = new FileSystemXmlApplicationContext(filename); 
    sf = (SessionFactory) ctx.getBean("sessionFactory"); 
    Session s = sf.openSession(); 
    TransactionSynchronizationManager.bindResource(sf, new SessionHolder(s)); 
} 

@After 
public void tearDown(){ 
    System.out.println("TearDown() running...."); 
    SessionHolder holder = (SessionHolder)TransactionSynchronizationManager.getResource(sf); 
    Session s = holder.getSession(); 
    s.flush(); 
    TransactionSynchronizationManager.unbindResource(sf); 
    SessionFactoryUtils.closeSession(s); 
} 

private SessionFactory sf; 
private ApplicationContext ctx; 

А потом я пишу еще один метод, но это исключение воскрешены! Это странно. Я перезапускаю первый метод тестирования, он работает. Но второй - нет.

Первый метод испытания, как это:

@Test 
public void testFindAll() { 
    UserGroupService userggroupService = (UserGroupService) ctx.getBean("UserGroupService"); 

    try { 
     List groups = userggroupService.findAll(); 
     System.out.println(groups); 
     if (groups != null){ 
      for (Object grp : groups){ 
       UserGroupBean group = (UserGroupBean) grp; 
       System.out.printf("id=%d, name=%s, %d members\n", group.getId(), group.getName(), group.getMembers()==null?0:group.getMembers().size()); 
       if (group.getMembers() != null){ 
        for(UserBean user: group.getMembers()){ 
         System.out.printf("\tuser-%d, %s\n", user.getUserID(), user.getName()); 
        } 
       } 
      } 
     } 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

} 

Второй метод испытания, как это:

@Test 
public void testDeleteRel() { 
    String filename = "WebContent\\WEB-INF\\classes\\applicationContext.xml"; 
    ApplicationContext ctx = new FileSystemXmlApplicationContext(filename); 

    UserGroupService service = (UserGroupService) ctx.getBean("UserGroupService"); 


    try { 
     UserGroupBean userGroup = new UserGroupBean(); 
     userGroup.setId(1L); 
     UserGroupBean group = (UserGroupBean) service.getUserGroup(userGroup); 
     List<UserBean> members = group.getMembers(); 
     System.out.println(members.size()+" members"); 
    // members.remove(0); 
    // service.updateUserGroup(group); 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

Код PO так:

@Entity 
@Table(name = "UserGroupBean") 
public class UserGroupBean implements UserGroup { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    private String name; 

    @ManyToMany(targetEntity = UserGroupBean.class, 
     cascade = CascadeType.REFRESH, fetch = FetchType.LAZY) 
    @JoinTable(name = "UserGroupParents", joinColumns = { @JoinColumn(name = "group_id") }, inverseJoinColumns = { @JoinColumn(name = "parent_id") }) 
    //@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) 
    private List<UserGroupBean> parents; 

    @ManyToMany(targetEntity = UserBean.class, 
     cascade = CascadeType.REFRESH, fetch = FetchType.LAZY) 
    @JoinTable(name = "UserGroupMembers", joinColumns = { @JoinColumn(name = "group_id") }, inverseJoinColumns = { @JoinColumn(name = "user_id") }) 
    //@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) 
    private List<UserBean> members; 

    // Getters and setters ... 

Мой вопрос: почему те же @Before и @After код, но только один метод может работать хорошо? Что я пропустил?

Благодаря

ответ

0

хорошо, если я понял, что вы просите, в вашем втором методе испытаний, вы пытаетесь инициализировать контекст приложения еще раз, хотя он был инициализирован в методе ранее(). Это недействительный способ запустить весенний контекст в junit. Обратитесь к тем примерам, которые могли бы решить Yout является: Spring Junit или Spring Junit 2

+0

Да, вы правы. Я сделал глупую ошибку :) –

0

Для ошибки org.hibernate.LazyInitializationException использовать

 
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true) 
@Transactional 
public class TestAnything{ 
    ... 
} 
Смежные вопросы