Create方法的集成测试策略

时间:2013-02-26 14:42:00

标签: spring hibernate integration-testing unitils

我想测试创建的实体是否已正确保存到数据库。有一个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. 如果我使用hibernate,是否有必要测试创建实体?有人可以写你尝试测试低级别的休眠,但是hibernate有自己的测试。上面有一个简单的代码,但我可以想象一些特定的代码,它们同时存在更多的entites(例如,one-many加上几个one-one关系)。我想测试关系是否已正确保留。

  2. 有这样的模式吗?我有一个问题,该记录不在数据库中。我不想使用返回的dto(它只提供agregate root实体 - person,但它没有说人基本数据(one-many),person地址(one-many)等。)...我想要得到坚持记录。

2 个答案:

答案 0 :(得分:0)

我测试持久性的方法是:

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

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

答案 1 :(得分:0)

我决定为创造人重做服务方法。

  1. PersonService仅负责创建域实体Person - test只会测试返回的DtoPerson及其值。
  2. PersonService将注入AddressService,PersonBasicDataService,它们拥有自己的创建方法,其中collection为参数。这些服务将拥有自己的测试类,并仅测试返回的DtoAddress或DtoPersonBasicData集合。
  3. 测试将简单而且只会解决自己的责任。 : - )

    正如@ Ralph在他的回答中的评论中所说 - 这个测试用例不是关于服务层。有必要测试域层。还有一个我不在集成测试中使用的新想法 - 测试有自己的hibernate会话。