第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

在模擬類中初始化私有字段

在模擬類中初始化私有字段

寶慕林4294392 2022-06-15 17:37:39
我的類中有一個私有字段和一個方法,如果設(shè)置了某個標志并且地圖包含某個值,則該方法正在修改它。我想測試該方法并查看結(jié)果。這是代碼(為簡潔起見,省略了不相關(guān)的字段和方法):我的課:class UsersLoader {   private Collection<User> users;   private Map<Integer,Boolean> status;   UsersLoader() {      users = new ArrayList<>();      status = new HashMap<>();   }   protected loadExternalUsers(boolean condition) {      Collection<User> externalUsers = LoadUsersFromSomeExternalSource();      if (condition && status.get(SOME_KEY)) {         users.addAll(externalUsers);      } else {         /* do not modify my users */      }   }}我的測試:import static org.mockito.Mockito.mock;public class UsersLoaderTest {   private UsersLoader loader;   @Before   public void setUp() {      loader = mock(UsersLoader.class);      doCallRealMethod().when(loader).loadExternalUsers(anyBoolean());   }   @Test   public void testLoadingWhenFlagIsTrue {      Collection<User> users = loader.loadExternalUsers(true);      assertThat(users.size() == 1);   }   @Test   public void testLoadingWhenFlagIsFalse {      Collection<User> users = loader.loadExternalUsers(false);      assertThat(users.size() == 0);   }}當我運行測試時,我得到了一個NullPointerExceptionin UsersLoaderclass,與檢查status.get(SOME_KEY). 即使我解決了這個問題,下一個 NPE 也將是下面的一行,因為 myusers將為空。如何在我的模擬類中初始化私有字段以便我可以使用它們?我可以創(chuàng)建一個 getter 和一個 setter 并模擬它們,但是整個測試就失去了意義。
查看完整描述

3 回答

?
倚天杖

TA貢獻1828條經(jīng)驗 獲得超3個贊

在您的情況下,您可以使用Spy而不是模擬。


這將觸發(fā)構(gòu)造函數(shù)并將一個空列表分配給私有變量,從而逃避 NPE:


private UsersLoader loader;


@Before

public void setUp() {

  loader = spy(new UsersLoader());

}

現(xiàn)在您不需要進行此調(diào)用:


  doCallRealMethod().when(loader).loadExternalUsers(anyBoolean());

請記住,您需要模擬任何不需要在實現(xiàn)時觸發(fā)的方法。


查看完整回答
反對 回復 2022-06-15
?
眼眸繁星

TA貢獻1873條經(jīng)驗 獲得超9個贊

不要模擬 UsersLoader.class,這是包含您要測試的方法的類。當您創(chuàng)建一個模擬時,模擬類將不會被實現(xiàn),而是您可以模擬該類的功能。而是監(jiān)視它或只是實例化并為功能提供檢查手寫檢查。在后一種情況下,您根本不需要 Mockito。所以你可以窺探它并使用mockito的特性來測試它的功能



查看完整回答
反對 回復 2022-06-15
?
慕的地8271018

TA貢獻1796條經(jīng)驗 獲得超4個贊

首先,將初始化移動到字段的聲明中:


private Collection<User> users = new ArrayList<>();

然后,你可以用你自己的 mock 注入這個字段:


@RunWith(MockitoJUnitRunner.class)

class UsersLoaderTest {

       @Mock

       private Collection<User> users;

       @InjectMocks

       private UsersLoader loader;

}

然后驗證是否users.add()已與您預期的用戶一起調(diào)用。


查看完整回答
反對 回復 2022-06-15
  • 3 回答
  • 0 關(guān)注
  • 113 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號