Как я могу создать модульный тест для этого метода? - PullRequest
0 голосов
/ 05 июня 2019

Как создать модульный тест для этой службы:

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())

Но что, если я не могу изменить сигнатуру метода?Как я могу проверить это?

Ответы [ 2 ]

2 голосов
/ 05 июня 2019

Вы издеваетесь над 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 путь; это на самом деле проще.

0 голосов
/ 05 июня 2019

Я бы здесь ничего не издевался.

У вас есть HashMap и пользователь.Чтобы иметь возможность работать с ними, они оба должны быть общедоступными.

Я не являюсь разработчиком Java, поэтому я оставлю аспект кодирования кому-то еще.

Я бы начал с внедрения UserStorage в класс (например, в конструкторе), чтобы вы могли затем использоватьэто и вы можете даже изменить реализации.Например, используйте интерфейс, чтобы при необходимости иметь несколько реализаций.

Как только вы это сделаете, вы сможете использовать его для извлечения пользователя из Службы, и вы можете отстаивать его.

Тест 1: добавить

  • инициализировать пустое хранилище
  • создать пользователя с ID = 1, имя = Петр
  • вызвать saveOrUpdate с этим пользователем
  • получить пользователя с идентификатором = 1 из хранилища
  • Подтвердить, что оно соответствует введенному вами пользователю.

Тест 2: обновление

  • инициализация пустого хранилища
  • создание пользователя с идентификатором = 1, имя = Петр
  • вызов saveOrUpdate для этого пользователя
  • обновление имени пользователя до John
  • вызов saveOrUpdate с обновленным пользователем
  • извлечение пользователя с ID = 1 из хранилища
  • Утверждение, что оно соответствует обновленному пользователю

добавить дополнительные тесты для нулевого пользователяили любые другие условия, которые вы хотите проверить.Я не стал бы насмехаться над этим, вместо этого протестировать реальные вещи.

это не включает изменение сигнатуры метода, а только способ, которым вы вводите свое хранилище в класс, который может быть с платформой IOC, если вы используете одинили просто DI, так что совсем не большие перемены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...