2012-02-21 13 views

答えて

1

単体テストで行うことができるのは、セッションと基準を模擬して期待値を設定することです.JMockを使用していくつかのケースでこれを行い、Restricitons用のHamcrestマッチャーを書く必要がありました。盲目的にテストカバレッジを増やす以外に、その中に大きな価値があると私は確信していません。一方

- 明確な使用であろう、ここで統合テストを書くには、いくつかのデータをメモリ内にデータベースを設定し、私はあなたが管理していると仮定した方法は、あなたの質問では、正しいオブジェクト

+0

セッションを嘲笑するのではなく、私たちはdao自体を模倣し、小さなモック配列で単純なif/else操作で基準の制限をエミュレートしますか?確かに、それは適切なモックを書くために開発者にいくつかのストレスをかけるが、私はそこにいくつかの利点を見ることができます。しかし、他の人がどのようにそれをやっているか見ることは、いつも素晴らしいことです。 –

0

取得のための統合テスト()のための例:あなたは春のフレームワークを使用する場合は、春のコンテキストとクラスのランナーを使用してDIを使用するために、スプリングテストモジュールを使用することができます

// if you can inject the object: 
// @Inject 
// public MyTestDAO<MyType> dao; 
// 

@Test 
public testGet() throws Exception { 
    Session session = HibernateUtils.getSessionFactory().getCurrentSession(); 
    MyTestDAO<MyType> dao = new MyTestDAO<MyType>(); 
    // if you use DI facility, check against null 
    // assertNotNull(dao) 
    MyType myType = dao.get(Test.class, 1L); 
    assertNotNull(myType); 
    assertEqual(myType, equalObj); 
    // more asserts? 
} 

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations={"classpath:spring.xml"}) 
0

を返すことを主張しますあなた自身のセッション。私はユニットテストの部分について話します。インテグレーションテストは、インテグレーション中にインメモリデータベースで実行できます。 H2またはDerbyは、私が知る限り、最も使用されているものの1つです。

あなたはDAOにモックセッションを渡すことができますが、同僚の一人が単体テストを書き、モックセッションに合格しなかった場合はどうなりますか?あなたはデータベースにヒットしますか?データベースをヒットしたくない場合は、この方法が問題になる可能性があります。

抽象的な工場パターンを使用してDAOをACQUIREする方がよいでしょう。あなたは、このように最初にあなたのダオを定義する場合

MyDao.get(someId); 

しかし、あなたは次のように行くことができます:基本的に、あなたのコードは次のように現在

public interface IDao <SomeGenerics> { 
    public <T> T get(Class<T> type, ID key); 
    //more generic methods 
} 

次に、あなたが持つことができますDaoの実装は次のようになります。

public class MyDao <SomeGenerics> implements IDao<SomeGenerics> { 
    public <T> T get(Class<T> type, ID key){ 
     //some real session stuff 
    } 
    //...more real session stuff 
} 

ユニットテストでは、ちょっとこのようなあなたのIDaoインターフェイスのモック、:

public class MyDaoMock <SomeGenerics> implements IDao<SomeGenerics> { 
    //this thingy can hold a small array of mock instances 
    private ArrayList<T> mockInstances; 

    public <T> T get(Class<T> type, ID key){ 
     //some fake stuff, kinda like this; 
     for (T mockInstance : mockInstances) { 
       if (mockInstance.getId().equals(key)) {//here i assume your T has a method getId, you figure out the kinks 
        return mockInstance; 
       } 
     } 
     //if not found, emulate your persistence's behavior, return null, throw an exception or do whatever 
     return null; 

    } 
    //...more fake stuff 
} 

今、あなたはインターフェイスと2つの実装、本番コード用とあなたのユニットテストのための1つを持っています。これで、生産現場やコードをテストする際に、適切なDAOを提供するためのファクトリパターンを実装するだけです。

関連する問題