我需要一些幫助來理解如何對以下內容進行單元測試。我有以下類結構。我必須按原樣遵循結構,因為這是根據我們產品的框架,我不能偏離這一點。package com.rohan.baseimport javax.inject.Inject;public abstract class ServiceBase { @Inject protected CommandExecutorBase commandExecutor; public final void execute() { commandExecutor.execute(this); } }--------------------------------------------------------package com.rohan.servicespublic class MyService extends ServiceBase { public void someMethod() {} }--------------------------------------------------------package com.rohan.delegatesimport javax.inject.Inject;import com.rohan.services.MyServicepublic class MyDelegate { @Inject MyService myService; public void callService() { myService.execute(); } }我正在嘗試對編碼進行 TDD 方法,并且我想確保callService委托類中的execute方法調用Service 類上的方法。我嘗試了以下方法,但它在執行方法中給了我一個空指針異常(因為commandExecutor對象為空)。有人可以告訴我我該怎么做嗎?我不被允許使用 PowerMockito。import org.junit.Test;import org.mockito.Mockito;public class MyDelegateUnitTests { @Test public void validateServiceExecuteIsCalled() { MyDelegate delegate = new MyDelegate(); MyService serviceObject = Mockito.mock(MyService.class); delegate.myService = serviceObject; Mockito.doAnswer((i) -> { System.out.println("I am here"); return null; }).when(serviceObject).execute(); Mockito.verify(serviceObject, Mockito.times(1)).execute(); } }我無法模擬 commandExecutor 對象,因為它不可訪問(與我的 Delegate 類不同的包)。代替Mockito.doAnswer(),我也嘗試過Mockito.doNothing().when(serviceObject).execute();但我得到了同樣的例外。有人可以告訴我,當我嘗試在when方法中定義模擬時,為什么它會繼續嘗試執行真正的方法?謝謝!
2 回答

幕布斯6054654
TA貢獻1876條經驗 獲得超7個贊
作為單元測試的一部分,我認為不需要定義myService.execute方法的行為。定義行為有點不必要
Mockito.doAnswer((i) -> {
System.out.println("I am here");
return null;
}).when(serviceObject).execute();
您可以刪除上面的代碼。
驗證該execute方法被調用的次數是否正確就足夠了。要回答您的問題,一個建議是使用基于構造函數的注入?;旧蟿摻ㄒ粋€構造函數MyDelegate并注入Myservice。并在測試中,執行以下操作:
MyService serviceObject = Mockito.mock(MyService.class);
MyDelegate delegate = new MyDelegate(serviceObject);
如果您不想在委托類中使用基于構造函數的注入,則其他選擇是在測試中使用@InjectMocks和@Inject。
添加回答
舉報
0/150
提交
取消