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. 休止状態を使用する場合、エンティティの作成をテストする必要がありますか?誰かがあなたに低レベルの休止状態をテストしようと書くことができますが、休止状態には独自のテストがあります。上記の些細なコードがありますが、同時により多くのエンティティを持続させる特定のコードを想像することができます(たとえば、1対多といくつかの1対1の関係)。そして、関係が正しく持続しているかどうかをテストしたいと思います。

  2. この方法でテストするパターンはありますか?問題があります。そのレコードはデータベースにありません。返されたdtoを使用したくない(ルートエンティティの集合体のみを表示します-personですが、personの基本データ(1つ)、personのアドレス(1つ)などについては説明していません)...永続化されたレコードを取得します。

4

2 に答える 2

0

永続性をテストするために私が行うことは次のとおりです。

  • 1)ドメインエンティティを作成します。
  • 2)Hibernate/JPAで保存します。
  • 3)休止状態のセッション/エンティティマネージャーをフラッシュしてクリアします
  • 4)Hibernateを使用してエンティティを再度ロードします
  • 5)元のエンティティを私が(再)ロードしたエンティティと比較します

だから私はマッピングが多かれ少なかれ正しく、すべてのものが持続することをかなり確信しています

于 2013-02-26T15:19:13.570 に答える
0

作成者のサービス方法を作り直すことにしました。

  1. PersonServiceは、ドメインエンティティPersonの作成のみを担当します。testは、返されたDtoPersonとその値のみをテストします。
  2. PersonServiceは、AddressService、PersonBasicDataServiceを注入します。これらは、パラメーターとしてコレクションを持つ独自のcreateメソッドを持っています。これらのサービスには独自のテストクラスがあり、返されたDtoAddressまたはDtoPersonBasicDataのコレクションのみをテストします。

テストは単純であり、自分の責任のみを解決します。:-)

@ラルフが彼の答えの下でコメントで言ったように-このテストケースはサービス層についてではありません。ドメイン層をテストする必要があります。そして、統合テストでは使用しない新しいアイデアがあります。テストには独自の休止状態セッションがあります。

于 2013-02-27T05:45:08.123 に答える