[英]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:添加
測試2:更新
為空用戶或您要測試的任何其他條件添加更多測試。 我不會嘲笑這個,而是測試真實的東西。
這並不涉及更改方法的簽名,僅涉及將存儲注入IOC框架中的類的方式,如果您使用一個或簡單的DI,則根本就沒有太大的變化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.