为什么在单元测试中使用@MockBean注释时未初始化bean

问题描述

我有一个非常糟糕的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。 并且它将允许您对所需的对象执行所有测试操作。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...