2015-09-04 70 views
1

我想在不依赖应用程序的数据库的情况下获得一些测试工作。该应用程序正在使用JPA w/Hibernate。我曾尝试在方法和类上使用@Transactional注解该类,但没有成功。单元测试一个依赖于@OneToMany集合的类

这里是Employee.java的关系:

@OneToMany(mappedBy = "manager", cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
private List<Employee> directReports; 

这里的测试,最后ARG是manager

Employee ceo; 
Employee evp; 

@Before 
public void setup() { 
    ceo = new Employee("Name", "ceo", null); 
    evp = new Employee("Name", "evp", ceo); 
} 

@Test 
public void testThatDirectReportsAreAssignedWithoutPersistence() { 
    assertNotNull(ceo.getDirectReports()); 
} 
+0

你如何运行你的单元测试?为什么你期望,如果你自己没有做这个清单,那么这个清单是人口稠密的? – dunni

+0

你可以发布你的构造函数Employee(),因为你正在测试没有任何数据库,所以没有实体持久化或链接到休眠会话,所以你将不会有任何冬眠魔术的自动映射你的关联.. –

+1

Hibernate在这里是完全不相关的。你必须测试'getDirectReports()'在'new Employee(“Name”,“ceo”,null)';上调用时不会返回null。这完全取决于构造函数和Employee的getDirectReports()方法。你还没有发布。 –

回答

0

你有什么是双向的关系。 Hibernate会自动填充关系的两端,但只有当它从数据库中读取时才会自动填充。如果你仅仅创建或者更新关系而没有往返数据库,它就不会着手修复另一端。其他JPA实施AFAIK也没有。

对于双向关系,人们通常会解析为像这样的结构: How to handle bidirectional relationships when constructing hibernate entities?,但通常会导致混乱的代码。

更好:尝试避免双向关联。

+0

你能帮我明白为什么这是'双向'吗?你能否为经理人员场景提供一种替代方法?谢谢! –

+0

你可以显示构造函数吗? – greyfairer