0

有一个 @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" })

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

版本:

  • 爪哇:1.8
  • 春季启动:2.1.17
  • 六月:4.12
  • 模拟:2.23.4
4

3 回答 3

1

只是为了确保(因为在问题中,它没有显示):类TestClassSpring bean(组件,服务......)?

编辑(TestClassis组件):

这不是如何Spring bean创建的;

如果TestClassrequire @Value 的构造函数,那么只有 Spring 会保证在实例化TestClasstest.value1值之前可用。因此,您可以添加到构造函数 @Value("${test.value1}")String value1并设置value1属性。

请阅读如何Spring注入的方式。

于 2022-01-25T07:10:36.873 回答
0

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

于 2022-01-06T06:53:45.967 回答
0

我无法解决主要问题,但我像这样满足了我的要求。

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

    ---
}

这可能不是正确的做法。

于 2022-01-25T06:19:54.867 回答