2013-02-26 69 views
0

我想测试,如果创建的实体已经正确地持久化到database.There是创建方法的服务集成测试:集成测试策略的创建方法

@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(它只提供了根集合的实体 - 人,但它没有说人的基本数据(一对多),人的地址(一对多)等)。我想获得持久记录。

回答

0

我做些什么来测试持久性:

  • 1)我创建域实体,
  • 2)使用Hibernate/JPA保存它,
  • 3)齐平,并明确休眠会话/实体管理器
  • 4)再次加载实体并进入休眠状态
  • 5)比较原始实体和我已经(重新)加载的实体

,所以我敢肯定,映射或多或少是正确的,每一件事情GET坚持

+0

存在问题。 Dao层不允许服务层和服务层不允许我获取实体管理器,因此无法调用实体管理器API。我决定为人员重做服务层级并分工负责。 – tomascejka 2013-02-27 05:43:42

+0

该测试涉及到dao层和域对象。没有涉及服务层。 - 无论如何,我认为严格的分层与主代码相关,但与测试代码无关。 – Ralph 2013-02-27 06:19:14

+0

“_this测试与dao层和域对象有关_” - 好的,现在我明白了你的答案....“_Anyway我认为严格的分层与主代码相关,但与测试代码无关。” - 它是有趣。如果我已经正确理解了第二句,那么测试将拥有自己的hibernate会话(并且不要使用服务层来加载数据)来测试例如。这个测试用例。对? – tomascejka 2013-02-27 12:10:20

0

我决定返工服务方法创建人。

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

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

作为@Ralph在他的回答下评论说 - 这个测试案例不是关于服务层的。有必要测试域图层。还有什么是我不用于集成测试的新想法 - 测试拥有自己的休眠会话。