对于私有变量,如何编写Junit测试用例?



每当我尝试执行这段代码时,我都会得到这个变量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");

它应该对你有帮助。

相关内容

  • 没有找到相关文章

最新更新