java - 模拟存储库 JUnit 时出现 NullPointerException
问题描述
我创建了一个带有控制器、服务和存储库层的基本 Rest API。我现在正在尝试为通过产品 ID 查找产品的服务层方法编写单元测试。但是,当我运行测试时,它会在我尝试模拟存储库 findById() 方法的行中引发 NullPointerException。
服务层的getProductById()方法如下:
public Product getProductById(String id){ return productRepository.findById(id).orElse(null); }
我的服务层测试类:
package com.product.Services;
import com.product.Entities.Product;
import com.product.Repositories.ProductRepository;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
class ProductServiceTest {
@InjectMocks
ProductService productService;
@Mock
ProductRepository productRepository;
@Test
void getProductById() throws Exception {
Product product = new Product();
product.setId("001");
product.setName("TV");
product.setPrice(999.99);
when(productRepository.findById("001").orElse(null)).thenReturn(product);
assertEquals(product,productService.getProductById("001"));
}
}
解决方案
问题是这里使用了 2 个不同版本的 JUnit:
org.junit.jupiter.api.Test
来自 JUnit5,而
org.junit.runner.RunWith
来自 JUnit4。
RunWith
在 JUnit5 中不再存在。
在这种特定情况下,我将使用 JUnit4 - 即使用注释org.junit.Test
(而不是org.junit.jupiter.api.Test
)来注释您的测试。
How to use Mockito with JUnit5提供了其他有效的解决方案。
推荐阅读
- python - Tkinter 标签在创建时显示和消失
- python - Discord Music Bot im Python 添加队列
- php - 通过 x 和 y 获取
- javascript - ChartJS 在多数据集图表中显示 2 个值而不是一个?
- haskell - 用 zf 表示法实现长度函数
- react-native - 如何在 react-native 中使用 AsyncStorage 动态设置 initialRouteName?
- function - 如何编写递归减法的序言程序
- python - Python:如何将 UTC 时间戳从 mm/dd/yyyy hh:mm:ss AM 更改为 dd/mm/yyyy hh:mm:ss AM
- swift - 手表进入睡眠模式时使用定时器
- python - 将整数列表划分为偶数和奇数的交替组