想要在 jUnit 测试中访问延迟加载的集合时出现 NullPointerException

Posted

技术标签:

【中文标题】想要在 jUnit 测试中访问延迟加载的集合时出现 NullPointerException【英文标题】:NullPointerException when want to access lazy loaded collection in jUnit test 【发布时间】:2014-03-14 19:34:30 【问题描述】:

在我的 Spring 应用中,我有两个实体:

@Entity
public class Category 
  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private int id;
      ....
  @OneToOne
  @Cascade(CascadeType.ALL)
  @JoinColumn(name="page_id")
  private Page page;

  @OneToMany(fetch=FetchType.LAZY, mappedBy="category")
  private List<Shop> shop;

      ..getters and setters
 

  @Entity
  public class Shop 

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

  @OneToOne(mappedBy="shop")
  private Settings settings;


  @ManyToOne
  @Cascade(CascadeType.SAVE_UPDATE)
  @JoinColumn(name = "category_id")
  private Category category;

  @OneToOne
  @Cascade(CascadeType.ALL)
  @JoinColumn(name = "page_id")
  private Page page;
      ...getters and setters

在我的测试 jUnit 中,我添加了一些类别和一些具有此类别的商店,当我想访问当前类别的商店列表时出现错误 java.lang.NullPointerException ....

我的测试:

@ContextConfiguration(locations = 
    "classpath:security-context.xml",
    "classpath:dao-context.xml"
)
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@TransactionConfiguration(transactionManager="transactionManager", defaultRollback=false)
@Transactional
public class CategoryTest  

Shop shop1 = new Shop(....);
Shop shop1 = new Shop(....);
Category category1 = new Category(....);
Category category2 = new Category(....);

@Test
public void someTest()
    shop1.setCategory(category1);
    shop2.setCategory(category2);
    shopService.add(shop1);
    shopService.add(shop2);
    assertEquals(2, shopService.getAllShop().size());
    assertEquals(2, categoryService.getAllShop().size());
      //IN THIS LINE I HAVE A ERROR
    assertEquals(1, categoryService.getCategory(category1.getId()).getShop().size());
   
 

为了访问惰性属性,我添加到我的 web.xml 过滤器中:org.springframework.orm.hibernate3.support.OpenSessionInViewFilter 这在前面的应用程序中正常工作,而不是在 jUnit 测试中。 我在哪一点上出错了?

【问题讨论】:

【参考方案1】:

延迟加载仅发生在事务内部,当会话打开时。因此,除非您事先初始化延迟加载的集合,否则您在测试方法中会得到 null。

Another similar question

【讨论】:

我知道,所以我将 org.springframework.orm.hibernate3.support.OpenSessionInViewFilter 添加到我的 web.xml 并将 @Transactional 注释添加到我的测试类。但这无济于事。我错了吗?

以上是关于想要在 jUnit 测试中访问延迟加载的集合时出现 NullPointerException的主要内容,如果未能解决你的问题,请参考以下文章

运行 Gradle JUnit 测试时出现“地址已在使用:绑定”异常

在Katalon Studio中执行Junit测试时出现内部错误

下拉菜单在第一页加载时出现延迟

在 Spring App 中将 MockitoMVC 与 Junit 一起使用时出现 *** 错误

Junit测试代码时出现initializationError 错误

使用Junit单元测试及操作MySQL数据库时出现错误及解决方法