簡體   English   中英

如何為該方法創建單元測試?

[英]How can I create unit test for this method?

如何為該服務創建單元測試:

public class UserService {

    private Map<String, User> userStorage = new HashMap<>();

    public void saveOrUpdate(User user) {
        User userFromStorage = userStorage.get(user.getId());

        if (userFromStorage == null) {
            userStorage.put(user.getId(), user);
        } else {
            userFromStorage.setName(user.getName());
            userStorage.put(userFromStorage.getId(), userFromStorage);
        }
    }
}

如何檢查用戶創建或更新成功?

我可以將void更改為User並返回更新的用戶並創建它:

assertEquals(user.getName(), updatedUser.getName())

但是,如果我不能更改方法簽名怎么辦? 我該如何測試?

您可以模擬userStorage和傳遞的User

@RunWith(MockitoJunitRunner.class)
class UserServiceTest {
    @InjectMocks private UserService sut;
    @Mock private Map<String, User> storage;
    @Test
    public void testUpdate() {
        final String ID = "1";
        // setup user passed to method
        User user = mock(User.class);
        when(user.getId()).thenReturn(ID);
        when(user.getName()).thenReturn("name");
        // setup user already known to service
        User fromStorage = mock(User.class);
        when(fromStorage.getId()).thenReturn(ID);
        when(storage.get(ID)).thenReturn(fromStorage);

        // run method under test
        sut.saveOrUpdate(user);

        // check update was performed and storage updated
        verify(fromStorage).setName("name");
        verify(storage).put(ID, fromStorage);
    }
}

我將把save路徑留給您; 實際上更簡單。

我不會在這里嘲笑任何東西。

您有一個HashMap和一個User。 為了能夠與他們合作,它們都需要公開訪問。

我不是Java開發人員,所以我將把編碼方面留給其他人。

我將從將UserStorage注入到類中開始(例如在構造函數中),以便隨后可以使用它,甚至可以更改實現。 例如,使用一個接口,以便在需要時可以有多種實現。

完成此操作后,就可以使用它從服務中檢索用戶,並且可以對其進行斷言。

測試1:添加

  • 初始化空存儲
  • 創建ID = 1,名稱= Peter的用戶
  • 與此用戶調用saveOrUpdate
  • 從存儲中檢索ID = 1的用戶
  • 斷言它等於您輸入的用戶。

測試2:更新

  • 初始化空存儲
  • 創建ID = 1,名稱= Peter的用戶
  • 與此用戶調用saveOrUpdate
  • 將用戶名更新為John
  • 使用更新的用戶致電saveOrUpdate
  • 從存儲中檢索ID = 1的用戶
  • 斷言它等於更新的用戶

為空用戶或您要測試的任何其他條件添加更多測試。 我不會嘲笑這個,而是測試真實的東西。

這並不涉及更改方法的簽名,僅涉及將存儲注入IOC框架中的類的方式,如果您使用一個或簡單的DI,則根本就沒有太大的變化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM