Могу ли я полностью опустить частный метод в протестированном методе publi c, использующем JUnit? - PullRequest
0 голосов
/ 27 марта 2020

У меня проблема с одним тестом.

Скажем, был такой метод:

public Item doSomething(Some parameters) {
    Item item = someMethodDoingSomethingWithParameters(parameters)
    return item;
}

, но затем я ввел новую функциональность, отправляя уведомления.

public Item doSomething(List<Some> parameters) {
    Item item = someMethodDoingSomethingWithParameters(parameters)
    sendNotificationToItemOwners(parameters);
    return item;
}

этот sendNotificationToItemOwners(List<Some> parameters) метод выглядит следующим образом:

private void sendNotificationToOwners(parameters) {
    parameters.stream().forEach(parameter -> notificationService.sendNotification(paremeter.getOwnerEmail());
}

Я не хочу проверять лямбду и не хочу проверять NotificationService, потому что он уже готов хорошо проверено.

Код, который я написал, является очень упрощенной версией моего исходного кода. Добавление этого нового метода sendNotificationToOwners() вызывает у меня головную боль, тест не пройден, я пытаюсь смоделировать некоторые требуемые объекты, но, похоже, это не решает мою проблему.

Могу ли я полностью опустить этот метод в тесте? Было бы замечательно, если бы это было возможно ..

1 Ответ

0 голосов
/ 13 апреля 2020

Я не хочу проверять лямбду,

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

, и я не хочу проверять NotificationService, потому что он уже хорошо протестирован.

Затем смоделируйте его и разрешите вводить экземпляр в тестируемый класс с помощью конструктора или фабричного метода (или аннотировать поле, если вы используете инфраструктуру внедрения зависимостей). Ваша личная лямбда все равно будет выполняться, но фактически не будет использовать другой, возможно, сложный класс. Если тестируемый здесь класс не позволяет предоставить экземпляр NotificationService при создании, выполните рефакторинг, чтобы можно было инвертировать управление .

Может Я полностью опускаю этот метод в тесте? Было бы замечательно, если бы это было возможно ..

Технически, вместо внедрения ссылки NotificationService, вы можете извлечь приватный метод sendNotificationToOwners в отдельный класс и внедрить / смоделировать это. Однако этот класс просто перебирает параметры и вызывает NotificationService. Похоже, немного излишним. Я предпочитаю вводить NotificationService и просто запускать лямбду и вызывать sendNotification для ложного / шпионского объекта. Это также позволит вам проверить, что NotificationService вызывается для каждого параметра.

...