0

我想测试创建的实体是否已正确持久化到数据库。create 方法有一个服务集成测试:

@SpringApplicationContext({"setting ...."})
public class PersonServiceIntegrationTest extends UnitilsJUnit4 {
     @SpringBeanByName
     private PersonService personService;
     @Test
     public void createPerson() {
        String name = "Name";
        String sname = "Surename";
        DtoPerson item = personService.createPerson(name, sname, Arrays.asList( new DtoAddress("Pisek","CZE", true), new DtoAddress("Strakonice", "CZE", false) );
        Assert.notNull("Cannot be null", item);
        /* 
         *  This assertion fails because of transaction (I suppose) - item is not in
         *  database right now. 
         *  Why? Returned dto 'item; is not null?
         */
        //domain with all fetched related entities, eg. address
        Person p = personService.getPerson(item.getIdPerson());
        List<Address> addresses = p.getAddresses();
        Assert.notNull("Cannot be null", p);
        Assert.notNull("Cannot be null", addresses);//return collection of Address
        Assert.notFalse("Cannot be emtpty", addresses.isEmpty());
        ReflectionAssert.assertPropertyLeniens("City", Arrays.asList("Pisek", "Strakonice"), addresses);
     }
}
  1. 如果我使用休眠,是否有必要测试创建实体?有人可以写你尝试测试低级休眠但休眠有自己的测试。上面有一个简单的代码,但我可以想象一些特定的代码同时保留更多的实体(例如,一对多加上几个一对一的关系)。我想测试关系是否得到了正确的维持。

  2. 有没有一种模式可以以这种方式进行测试?我有一个问题,该记录不在数据库中。我不想使用返回的 dto (它只呈现聚合根实体 - 人,但它没有说明人员基本数据(一对多)、人员地址(一对多)等)......我想获取持久记录。

4

2 回答 2

0

我决定为创建人重新设计服务方法。

  1. PersonService 仅负责创建域实体 Person - test 将仅测试返回的 DtoPerson 及其值。
  2. PersonService 将注入 AddressService、PersonBasicDataService,它们有自己的创建方法,以集合为参数。这些服务将有自己的测试类,并且只测试返回的 DtoAddress 或 DtoPersonBasicData 集合。

测试将很简单,只会解决自己的责任。:-)

正如@Ralph在他的回答下的评论中所说 - 这个测试用例与服务层无关。有必要测试领域层。还有一个我没有在集成测试中使用的新想法——测试有自己的休眠会话。

于 2013-02-27T05:45:08.123 回答
0

我测试持久性的方法是:

  • 1)我创建域实体,
  • 2) 用 Hibernate/JPA 保存它,
  • 3) 刷新和清除休眠会话/实体管理器
  • 4)用休眠再次加载实体
  • 5)将原始实体与我(重新)加载的实体进行比较

所以我很确定映射或多或少是正确的,并且每件事都会被持久化

于 2013-02-26T15:19:13.570 回答