首页 > 解决方案 > 如何为此方法创建单元测试?

问题描述

如何为此服务创建单元测试:

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);
        }
    }
}

如何检查用户是否成功创建或更新?

我可以更改voidUser返回更新的用户并创建它:

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

但是如果我不能更改方法签名怎么办?我该如何测试它?

标签: javaunit-testingtestingjunit

解决方案


你嘲笑 theuserStorage和 pass 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路留给你;实际上更简单。


推荐阅读