2017-02-23 122 views
1

我無法嘲笑從TransactionalDao任何方法。模擬休眠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

我不認爲你可以在Mockito中嘲笑這種行爲。

我會建議如下(按順序):

1)如果你不重寫addOrUpdate方法,然後從方法調用super前綴,那麼的Mockito會嘲笑這種方法:

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

2)不知道是什麼促使你真正用Dao類擴展Service類。我認爲你應該選擇作曲。當你將Dao用作依賴時,那麼嘲笑該方法不會再成爲問題。

3)如果你不能去任何上述的,那麼你會留下類似下面的一些定製的解決方法:

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); 
} 
} 

測試

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); 
     } 
} 

底線是,如果這不是一些舊的遺留代碼,你不能觸摸,然後去選擇2 ..整個應用程序將受益。