1) Вы пишете модульный тест, а не тест на срезы или интеграционный тест. Поэтому здесь Spring Boot не имеет значения, поскольку вам не нужно загружать контейнер для проверки логики вашего компонента.
Вы можете прочитать мой вопрос / ответ об этом поле , если вы заинтересованы.
2) Ветвь (if/else
) в логике означает, что у вас есть несколько сценариев.
Под разными сценариями подразумеваются, как правило, разные методы испытаний и значимые имена.
Вы также можете положиться на данную / когда / затем идиому.
3) Поскольку в вашем тесте входная информация для ветви предоставляется макетом, это также означает, что вы будете регистрировать различные варианты поведения для макета в каждом методе теста.
4) UserService
не нужно издеваться. Это должно быть значение, возвращаемое макетом, а не самим макетом. Здесь вы должны издеваться над Map
.
5) Вы тестируете UserFactory
, поэтому вы должны назвать его UserFactoryTest
.
Например:
@RunWith(MockitoJUnitRunner.class)
public class UserFactoryTest {
@Mock
private Map UserMap;
@InjectMocks
private UserFactory UserFactory;
private String userId = "123";
@Test
public void getUser(){
when(UserMap.get(userId)).thenReturn(userService);
userService actual = userServiceFactory.getUser(userId);
assertEquals(UserMap.get(userId), actual);
}
@Test
public void getUser_with_unknown_userId(){
Assertions.assertThrows(IllegalArgumentException.class,
()-> userServiceFactory.getUser(userId));
}
}
Вы замечаете, что во втором случае я не регистрирую никакого поведения для макета.
По умолчанию Mockito вернет null
и на самом деле это то, что мне нужно, чтобы спровоцировать исключение. Так что все в порядке.
Также обратите внимание, что я написал утверждение, полагаясь на библиотеку JUnit 5, а не на библиотеку JUnit 4, которую вы, похоже, используете в соответствии с используемым бегуном.
Вы должны рассмотреть возможность перехода на JUnit 5 для новых тестов.
Если значение должно быть изменено без того, чтобы перекомпилировать, Вам неизбежно нужно некоторое перенаправление, но выполнение еще одного довольно глупо, если на ключ нельзя сослаться больше чем в одном месте (самом возможный знак плохого разделения проблем).
Строки ключа должны быть достаточно описательными, что они не могут столкнуться с другими вне своего объема (обычно класс), и литералы хранения в уникальном едином классе ни комплекс, ни вероятно быть настолько серьезным беспокойством, чтобы заслужить их объявление в единственном блоке. Поэтому (IMO) эта практика является просто кем-то по-рабски после правил, не понимая исходное намерение правила.
Если необходимо заключить альтернативную инструкцию в кавычки им для выравнивания по ширине ослабления этого, может я предлагать KISS.
С одной стороны, Вы не можете ввести ключи с опечаткой при использовании констант, не получая ошибку компилятора.
Даже в день легкого расширенного поиска и замены (который не является новой вещью) использование константы сообщает, что Строка только для того файла свойств. Это хорошо потому что:
В большом количестве случаев это - просто хорошая привычка, в которую вошли программисты, но хорошие привычки там по причине.
Я видел эту практику прежде также, на самом деле после того как я был на проекте, где я должен был искать файл констант, который привел меня к XML-файлу, который наконец даст мне имя свойства, которое я искал. И затем я должен был посмотреть на файл свойств также, так как значение было тем, что я действительно хотел.
Я думаю это пример материала, что Jeff и Joel говорили о на последних подкастах, где разработчики слепо следуют практике, которую они услышали о (в этом случае, практика, чтобы никогда не иметь строковый литерал в Вашем коде), не думая о том, является ли это действительно соответствующим, учитывая вопрос под рукой.
Поскольку автоматическое заполнение работает лучше над идентификаторами для констант, но если все Ваши значения ключа являются "com.foo.bar.whatever", Вы не получаете обратной связи.