Я использую Spring 3.1.4.RELEASE и Mockito 1.9.5. В моем классе Spring у меня есть:
@Value("#{myProps['default.url']}")
private String defaultUrl;
@Value("#{myProps['default.password']}")
private String defaultrPassword;
// ...
Из моего теста JUnit, который я сейчас настроил так:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({ "classpath:test-context.xml" })
public class MyTest
{
Я хотел бы высмеять значение моего поля "defaultUrl". Обратите внимание, что я не хочу имитировать значения для других полей - я хотел бы оставить их такими, какие они есть, только поле «defaultUrl». Также обратите внимание, что у меня нет явных методов «установки» (например setDefaultUrl
) в моем классе, и я не хочу создавать их только для целей тестирования.
Учитывая это, как я могу имитировать значение для этого поля?
ReflectionTestUtils.setField(bean, "fieldName", "value");
перед вызовомbean
метода во время теста.Это был уже третий раз, когда я гуглил этот пост SO, поскольку я всегда забываю, как издеваться над полем @Value. Хотя принятый ответ верен, мне всегда нужно время, чтобы правильно выполнить вызов "setField", поэтому, по крайней мере, для себя я вставляю здесь пример фрагмента:
Класс продукции:
Тестовый класс:
источник
Вы также можете смоделировать конфигурацию своего свойства в своем тестовом классе
источник
Я хотел бы предложить связанное решение, которое заключается в передаче
@Value
аннотированных полей в качестве параметров конструктору вместо использованияReflectionTestUtils
класса.Вместо этого:
и
Сделай это:
и
Преимущества этого подхода: 1) мы можем создать экземпляр класса Foo без контейнера зависимостей (это просто конструктор) и 2) мы не связываем наш тест с деталями нашей реализации (отражение привязывает нас к имени поля с помощью строки, что может вызвать проблемы, если мы изменим имя поля).
источник
Вы можете использовать эту волшебную аннотацию Spring Test:
см. org.springframework.test.context.TestPropertySource
Например, это тестовый класс:
А это класс со свойством:
источник
Я использовал приведенный ниже код, и он сработал для меня:
Ссылка: https://www.jeejava.com/mock-an-autowired-value-field-in-spring-with-junit-mockito/
источник
Один из способов решить эту проблему - изменить свой класс на использование Constructor Injection , которое используется для тестирования и Spring инъекции. Больше никаких размышлений :)
Итак, вы можете передать любую строку с помощью конструктора:
И в своем тесте просто используйте это:
источник