JUnit中Service类依赖Mock问题:调用Product.getId()时product为空
解决JUnit测试中Product对象为空的问题
你遗漏的核心配置是为Mock的ProductService的findByName方法指定返回值,原因如下:
- 当用Mock框架(如Mockito)创建
ProductService的Mock实例时,所有未配置的方法默认返回null。调用productService.findByName()时得到null,后续调用getId()自然会抛出空指针异常。 - Mock对象不会主动连接真实数据库查询数据,哪怕数据库里存在"myProduct",测试场景也无法直接获取,必须手动Mock方法的返回结果。
具体修复步骤
- 构造一个模拟的Product对象,填充必要属性:
Product mockProduct = new Product(); mockProduct.setId(1L); // 对应数据库中myProduct的id mockProduct.setName("myProduct"); - 使用Mock框架语法配置
findByName方法的返回值:// 精确匹配参数值 when(productService.findByName("myProduct")).thenReturn(mockProduct); // 如果参数是动态的,也可以用任意字符串匹配 // when(productService.findByName(anyString())).thenReturn(mockProduct);
补充说明
如果你原本希望测试能访问真实数据库(集成测试场景),那不该使用@Mock注解注入ProductService,而是改用@Autowired注入真实实例,同时配置测试用数据库(比如H2内存数据库,并提前导入测试数据)。但当前你使用了Mock,就必须手动配置方法返回值。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

