Какой смысл того, чтобы использовать константы для ключей свойства?

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 для новых тестов.

5
задан jcrossley3 15 February 2009 в 15:13
поделиться

5 ответов

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

Строки ключа должны быть достаточно описательными, что они не могут столкнуться с другими вне своего объема (обычно класс), и литералы хранения в уникальном едином классе ни комплекс, ни вероятно быть настолько серьезным беспокойством, чтобы заслужить их объявление в единственном блоке. Поэтому (IMO) эта практика является просто кем-то по-рабски после правил, не понимая исходное намерение правила.

Если необходимо заключить альтернативную инструкцию в кавычки им для выравнивания по ширине ослабления этого, может я предлагать KISS.

6
ответ дан 18 December 2019 в 06:36
поделиться

С одной стороны, Вы не можете ввести ключи с опечаткой при использовании констант, не получая ошибку компилятора.

12
ответ дан 18 December 2019 в 06:36
поделиться

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

  • Постоянное средство опечатки получат ошибки компилятора, Строка, не было бы
  • константа позволяет Вам разделить ключевой "идентификатор" для стихов файла свойств ключевой "идентификатор" для другого XML-файла. Та же Строка, другое значение.
  • расширенный поиск и замена мог повредить много вещей, тогда как Ваш IDE позволит Вам искать все использования константы очень легко и изменить только соответствующие.

В большом количестве случаев это - просто хорошая привычка, в которую вошли программисты, но хорошие привычки там по причине.

6
ответ дан 18 December 2019 в 06:36
поделиться

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

Я думаю это пример материала, что Jeff и Joel говорили о на последних подкастах, где разработчики слепо следуют практике, которую они услышали о (в этом случае, практика, чтобы никогда не иметь строковый литерал в Вашем коде), не думая о том, является ли это действительно соответствующим, учитывая вопрос под рукой.

0
ответ дан 18 December 2019 в 06:36
поделиться

Поскольку автоматическое заполнение работает лучше над идентификаторами для констант, но если все Ваши значения ключа являются "com.foo.bar.whatever", Вы не получаете обратной связи.

0
ответ дан 18 December 2019 в 06:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: