nullpointerexception

k7fdbhmy  于 2021-07-05  发布在  Java
关注(0)|答案(3)|浏览(330)

我已经创建了一个带有控制器、服务和存储库层的基本restapi。我现在尝试为服务层方法编写一个单元测试,该方法通过产品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"));
   }
}

附加调试器显示内容的图片:

tcomlyy6

tcomlyy61#

JUnit5使用@extendwith(springextension.class)注解,您能更改@runwith注解并重试吗?

f8rj6qna

f8rj6qna2#

问题是这里使用了两个不同版本的junit: org.junit.jupiter.api.Test 来自junit5,而 org.junit.runner.RunWith 来自junit4。 RunWith 在junit5中不再存在。
在这个特定的例子中,我将使用junit4,即使用注解 org.junit.Test (代替 org.junit.jupiter.api.Test )为测试添加注解。
如何在junit5中使用mockito提供了其他有效的解决方案。

daupos2t

daupos2t3#

你应该嘲笑 findById 调用,而不是用 orElse :

when(productRepository.findById("001")).thenReturn(product);

相关问题