【发布时间】:2017-06-08 22:07:33
【问题描述】:
我想测试一个将“ObjectMapper”作为实例变量的类:
public class EventTransformerImpl implements EventTransformer {
@Inject
private ObjectMapper objectMapper;
private String convertParametersToJson(NotificationConfig config) {
String parametersAsJson = null;
try {
parametersAsJson = objectMapper.writeValueAsString(config.getOrdinaryParameters());
} catch (IOException e) {
logger.info("There was a problem in writing json:" + config.getParameters(), e);
parametersAsJson = null;
}
return parametersAsJson;
}
}
这个类没有任何用于初始化“objectMapper”的“setter”或“constructor”(它是使用“spring”初始化的):
<bean id="objectMapper" class="com.fasterxml.jackson.databind.ObjectMapper">
<property name="dateFormat">
<bean class="java.text.SimpleDateFormat">
<constructor-arg value="yyyy-MM-dd'T'HH:mm:ssZ"/>
</bean>
</property>
</bean>
当我想测试“EventTransformerImpl”类时,objectMapper 的值为空,如何在我的单元测试类中将“objectMapper”传递给“EventTransformerImpl”。
【问题讨论】:
-
是否有理由不向您正在测试的类添加 setter?提高可测试性会提高可维护性。
-
@David Wallace 我完全同意可测试性。但是 setter 允许可变性。如果不需要依赖的可变性,我宁愿使用构造函数。
-
是的。构造函数更好,至少在只有一个字段要设置的情况下。
-
@user2688902,如果你得到答案,请养成接受答案的习惯,这样可以鼓励人们将来回答更多问题。它还可以帮助其他人快速找到正确的解决方案。
标签: java spring unit-testing mockito inject