Junit - Spring boot:测试时@Value始终为null

tow*_*ity 5 java junit mockito spring-boot context-configuration

有一个@Value注释的常量,在运行测试时没有被初始化,当构造函数中需要它时,它会抛出NullPointerException。

要测试的示例类:

class TestClass {
    @Value("${test.value1}")
    private String value1;

    private final TestTemplate testTemplate;

    public TestClass(TestTemplateBuilder builder) {
        testTemplate = builder.someMethod(value1).build();
    }


    ---
}
Run Code Online (Sandbox Code Playgroud)

测试类示例:

@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());
    }

    ---
}
Run Code Online (Sandbox Code Playgroud)

尝试了一些方法,但没有任何效果:

  • 我已经创建了application.properties具有所需值的文件。
  • 创建application-test.properties并添加@TestPropertySource(locations="classpath:application-test.properties").
  • @SpringBootTest(properties = { "test.value1=VALUE" })

我也尝试过其他一些东西,但我得到的NullPoiterExceptionsomeMethod(value1).

版本:

  • 爪哇:1.8
  • Springboot:2.1.17
  • 朱尼特:4.12
  • 莫基托:2.23.4

小智 0

您收到 NullPointerException 的原因是值注入发生在构造函数调用之后。为了防止这种情况,您可以使用 spring 生命周期钩子在构造函数调用后初始化您的类。