模拟存储库JUnit

时间:2020-09-04 13:04:59

标签: java testing junit restapi

我创建了带有控制器,服务和存储库层的基本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"));
   }
}

附上调试器显示的图片: enter image description here

3 个答案:

答案 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
相关问题