我创建了带有控制器,服务和存储库层的基本Rest API。我现在正在尝试为通过产品ID查找产品的Service层方法编写单元测试。但是,当我运行测试时,它在我试图模拟存储库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"));
}
}
答案 0 :(得分:3)
问题是这里使用了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提供了其他有效的解决方案。
答案 1 :(得分:1)
JUnit 5使用 @ExtendWith(SpringExtension.class)批注,您可以更改 @RunWith 批注并重试吗?
答案 2 :(得分:0)
您应该模拟mysql -h127.0.0.1 -P12345 -uusername -p
调用,而不是与findById
链接的表达式:
orElse