亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 Mockito 的 Java Mock final void 方法

使用 Mockito 的 Java Mock final void 方法

狐的傳說 2021-09-29 15:19:52
我需要一些幫助來理解如何對以下內容進行單元測試。我有以下類結構。我必須按原樣遵循結構,因為這是根據我們產品的框架,我不能偏離這一點。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。


查看完整回答
反對 回復 2021-09-29
  • 2 回答
  • 0 關注
  • 407 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號