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

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

對作為一類實例的字段使用 Mock

對作為一類實例的字段使用 Mock

Helenr 2022-05-21 20:54:01
我有一堂課:public class Sender {    private final SomeClass firstField;    private final SomeClass secondField;    private Sender(SomeClass firtsField, SomeClass secondField){        this.firstField = firstField;        this.secondField = secondField;    }}@RunWith(MockitoJUnitRunner.class)public class SenderTest{    @Mock    private firstField;    @Mock    private secondField;}一切看起來都是等級的,但看起來它在兩個領域或類似的東西中注入了相同的對象。當我嘗試對一個字段使用 when(..).thenReturn() 時,它會設置另外兩個數據和虎鉗詩句;最奇怪的是它在調試模式下工作正常。你能說什么?
查看完整描述

2 回答

?
守著一只汪

TA貢獻1872條經驗 獲得超4個贊

Mockito 在構造函數注入兩個或多個相同類型的字段時存在一些問題。但是,如果您使用 setter 注入,它會完美運行。


所以你可以像這樣重構“Sender”類:


    public class Sender {

        private SomeClass firstField;

        private SomeClass secondField;

        public void setFirstField(SomeClass firstField) {

            this.firstField = firstField;

        }

        public void setSecondField(SomeClass secondField) {

            this.secondField= secondField;

        }

    }

請記住,如果類同時具有構造函數和設置器,Mockito 將選擇構造器進行注入并完全忽略設置器。


編輯:如果你出于某種原因肯定需要使用構造函數,你總是可以手動模擬字段而不是使用 Mockito 注釋。因此,在您的情況下,Sender 將保持不變,而 SenderTest 將是這樣的:


public class SenderTest {


    private SomeClass firstField;

    private SomeClass secondField;


    private Sender sender;


    @Before

    public void setUp() {

        firstField = Mockito.mock(SomeClass.class);

        secondField = Mockito.mock(SomeClass.class);


        sender = new Sender(firstField, secondField);

    }


    @Test

    public void smokeTest() {


    }

}


查看完整回答
反對 回復 2022-05-21
?
幕布斯7119047

TA貢獻1794條經驗 獲得超8個贊

這取決于它SomeClass本身是什么。它是一個數據(POJO)對象,值得在測試中創建它們(即填充隨機生成的值)。

如果是服務。它可能是架構問題的標志。為什么你需要相同服務的兩個副本?可能進行一些重構是有意義的。


查看完整回答
反對 回復 2022-05-21
  • 2 回答
  • 0 關注
  • 108 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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