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 для инициализации вашего класса после вызова конструктора.

Другие вопросы по тегам