问题描述
我有一个非常糟糕的bean实现
function initSelect(items) {
items.forEach(item => {
var option = $('#selectCriteria').children('[value="' + item + '"]');
option[0].selected = true;
option.detach();
$('#selectCriteria').append(option).change();
})
}
我还有一个测试,其中我用模拟替换了存储库。 但是,当我尝试通过存储库模拟访问测试中的“人”字段时,我得到了NullPointerException
@Component
public class Repository{
public List<String> people= new ArrayList<>();
为什么会这样? Bean是否已初始初始化?实施如此糟糕的正确解决方案是什么?
解决方法
Bean初始化为假定为@MockBean
。
它只为您生成一个存根。 Repository
类的所有嵌套内容都将被忽略。
在您的情况下,您有一个完全初始化的模拟。但是,当然,嵌套字段为null。如果是模拟的,则不会初始化嵌套字段。 Mock假定您只需要该特定类的包装即可模拟该行为。
您需要做的是将@MockBean
更改为@SpyBean
。
在这种情况下,您的类字段将按照您在Repository
类中定义的字段进行初始化。因此,您将拥有一个真实的Repository
对象,但将其包装为Mockito Spy。
并且它将允许您对所需的对象执行所有测试操作。