Junit - Весенняя загрузка: @Value всегда имеет значение null во время тестирования
Существует аннотированная константа @Value, которая не инициализируется при запуске теста, она выдает исключение NullPointerException, когда это требуется внутри конструктора.
Образец класса для тестирования:
class TestClass {
@Value("${test.value1}")
private String value1;
private final TestTemplate testTemplate;
public TestClass(TestTemplateBuilder builder) {
testTemplate = builder.someMethod(value1).build();
}
---
}
Образец тестового класса:
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = TestClass.class)
@SpringBootTest
class TestClassTest {
@MockBean
TestTemplateBuilder builder;
@Autowired
TestClass testClass = new TestClass(testTemplate);
@Before
public void setUp() {
ReflectionTestUtils.setField(testClass, "value1", "VALUE");
Mockito.when(builder.build()).thenReturn(new TestTemplate());
}
---
}
Вещи пробовали, но ничего не получалось:
- Я создал
application.properties
файл с требуемым значением. - Созданный
application-test.properties
и добавил@TestPropertySource(locations="classpath:application-test.properties")
. -
@SpringBootTest(properties = { "test.value1=VALUE" })
Я пробовал и другие вещи, но у меня получилось
NullPoiterException
в
someMethod(value1)
.
Версии:
- Java: 1.8
- Springboot: 2.1.17
- Юнит: 4,12
- Mockito: 2.23.4
4 ответа
Если @Before не работает, попробуйте @BeforeEach. Это сработало для меня.
`@BeforeEach
public void setUp() {
ReflectionTestUtils.setField(yourInstanceClass, "fieldName", "fieldValue");
}`
Просто чтобы убедиться (потому что в вопросе это не показано): class is (Component, Service...)?
Редактировать (
TestClassis
Компонент ):
Это не так
Spring bean
создаются;
Если конструктор требует @Value, то только Spring гарантирует, что перед созданием экземпляра
TestClass
в
test.value1
значение доступно. Таким образом, вы можете добавить в конструктор
@Value("${test.value1}")String value1
и установите
value1
имущество.
Пожалуйста, прочитайте способы того, как
Spring
вводить.
Мне не удалось решить основную проблему, но я выполнил свое требование следующим образом.
class TestClassTest {
TestClass testClass;
@Before
public void setUp() {
TestTemplateBuilder builder = Mockito.mock(TestTemplateBuilder.clsss);
TestTemplateBuilder builder1 = Mockito.mock(TestTemplateBuilder.clsss);
Mockito.when(builder.someMethod(nullable(String.class))).thenReturn(builder1);
Mockito.when(builder1.build()).thenReturn(new TestTemplate());
testClass = new TestClass(builder);
}
---
}
Возможно, это неправильный способ.
Причина, по которой вы получаете NullPointerException, заключается в том, что внедрение значения происходит после вызова конструктора. Чтобы предотвратить это, вы можете использовать хуки жизненного цикла Spring для инициализации вашего класса после вызова конструктора.