2017-02-23 16 views
1

TransactionalDaoからの方法を模擬することができません。模擬Hibernate transactionalDao

注: - Tは自分のエンティティクラスです。

コードの流れは次のとおりです。

public class MainClassImpl extends TransactionalDao<T> implements MainClass{ 

    public Set<T> method1(Set<T> setOfTypeT){ 
      return super.addOrUpdate(setOfTypeT); 
    } 
} 

私のテストクラス:

public class MainClassTest{ 
     @Test 
     public void method1Test(){ 
      MainClassImpl spy= Mockito.spy(new MainClassImpl()); 

      Set<T> setTest= new HashSet<T>(); 
      Mockito.doReturn(setTest).when((TransactionalDao<T>)spy).addOrUpdate(setTest); 

      spy.addOrUpdateDeviceDetails(setTest); 
     } 
} 

私はそれがTransactionalDaoを呼び出し、それを実行しようとしているデバッグモードで実行しています。 どうすればTransactionalDaoを模擬できますか?

答えて

0

私はあなたがモッキートでこのような行動を模擬することはできないと思います。

私は(そのために)、以下の助言:

:あなたはaddOrUpdateメソッドをオーバーライドいけない場合

1)は、その後、メソッド呼び出しからスーパープレフィックスを削除し、その後、Mockitoは、そのメソッドを模擬します

public Set<T> method1(Set<T> setOfTypeT){ 
     return addOrUpdate(setOfTypeT); 
} 

2)実際にDaoクラスを使用してServiceクラスを拡張する動機がわかりません。私の意見では、あなたは作曲を選ぶべきです。依存関係としてDaoを使用すると、その方法を嘲笑することはもはや問題にはなりません。

3)あなたは、あなたが以下のようないくつかのカスタムの回避策で残っている上記のいずれかのために行くことができない場合:この場合、

public class MainClassTest{ 
     @Test 
     public void method1Test(){ 
      MainClassImpl spy= Mockito.spy(new MainClassImpl()); 

      Set<T> setTest= new HashSet<T>(); 
      Mockito.doReturn(setTest).when(spy).baseAddOrUpdate(setTest); 

      spy.addOrUpdateDeviceDetails(setTest); 
     } 
} 

ボトムラインである

public class MainClassImpl extends TransactionalDao<T> implements MainClass{ 
public Set<T> method1(Set<T> setOfTypeT){ 
     return baseAddOrUpdate(setOfTypeT); 
} 

public Set<T> baseAddOrUpdate(Set<T> setOfTypeT){ 
    return super.addOrUpdate(setOfTypeT); 
} 
} 

テストあなたが触れることができない古いレガシーコードではなく、次にオプション2に向かう。アプリケーション全体が利益を得る。