【发布时间】:2022-01-06 04:40:05
【问题描述】:
有一个@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)。
版本:
- Java:1.8
- Springboot:2.1.17
- 六月:4.12
- 模拟:2.23.4
【问题讨论】:
-
我能说什么...抛弃 Mockito 并改用 Spock,然后添加 @SpringBootTest 注释,您将免费获得完整的测试容器。
-
您正在自己创建一个
TestClass的实例。它没有注入或处理任何东西。删除new TestClass以初始化该字段。此外,您应该注册行为,但您已经在构造函数中调用了模拟,所以这是不可能的。您应该做的是不要使用 Spring 进行此测试,自己创建模拟和实例并运行测试。您不必对所有事情都使用 Spring,尤其是如果您想编写一个简单的单元测试。 -
@M.Deinum 我明白了删除不必要的东西的意义。您能否分享一个示例或一些链接以帮助我理解。
标签: java spring-boot junit mockito context-configuration