【发布时间】:2020-09-04 13:04:59
【问题描述】:
我创建了一个带有控制器、服务和存储库层的基本 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"));
}
}
【问题讨论】:
-
您是否尝试过公开类/测试功能?你用的是什么模拟版本?
-
更改为 public 似乎并没有解决它。 mockito 版本是 org.mockito:mockito-core:3.3.3
-
嗨,克里斯。您是否尝试过在
@InjectMocks之前声明@Mock注释? -
@CarlosMancilla 订单无关紧要。但 Benoit 在他的回答中提出的建议是有道理的。