每当我尝试执行这段代码时,我都会得到这个变量effectiveEndDate的NullPointerException
@Component
public class CustomerCommodityMarkupMapService
{
@Value("${default.effective.endDate}")
private String effectiveEndDate;
public CommodityMarkup mapMarkupModelToEntity(CommodityMarkupView commodityMarkupView)
{
CommodityMarkup commodityMarkup = new CommodityMarkup();
commodityMarkup.setEffectiveEndDate(DateTimeUtil.convertStringToDate(effectiveEndDate));
}
@Test
void testMapMarkupModelToEntity()
{
CustomerCommodityMarkup mappedMarkup = new CustomerCommodityMarkup();
String effectiveEndDate = "12/31/9999";
if (effectiveEndDate != null)
{
commodityMarkup.setEffectiveEndDate(DateTimeUtil.convertStringToDate(effectiveEndDate));
}
CustomerCommodityMarkup actualMarkup = customerCommodityMarkupMapService.mapMarkupModelToEntity(commodityMarkupView);
assertEquals(mappedMarkup, actualMarkup);
}
你不应该通过将@Value
注释放到属性中来使用属性注入,而应该使用构造函数注入,像这样:
@Component
public class CustomerCommodityMarkupMapService {
private final String effectiveEndDate;
public CustomerCommodityMarkupMapService(@Value("${default.effective.endDate}") String effectiveEndDate) {
this.effectiveEndDate = effectiveEndDate;
}
}
您将能够在单元测试中设置该值。
如果你需要在测试中访问私有属性,你总是可以使用反射,但这有点像代码气味。
我们可以通过将属性文件放在测试资源中来覆盖属性。此文件必须与默认文件在相同的类路径上。
它应该包含默认文件中指定的所有属性键。因此,我们将application.properties
文件添加到src/test/resources
.
它将覆盖value。
你可以参考这里
你可以在这里使用反射来注入值。例如:
@BeforeEach
void setup() {
ReflectionTestUtils.setField(mappedMarkup, "effectiveEndDate", "12/31/9999");
}
或者你可以直接在test中使用它,在对象构造完成后像这样调用:
ReflectionTestUtils.setField(mappedMarkup, "effectiveEndDate", "12/31/9999");
它应该对你有帮助。