【问题标题】:How to write a mocked unit test for a db insert method in Springboot REST API?如何在 Spring Boot REST API 中为 db insert 方法编写模拟单元测试?
【发布时间】:2021-05-18 18:51:06
【问题描述】:

我有一个用 Spring Boot 编写的 REST API。

现在我想用 JUnit 和 Mockito 创建单元测试来模拟数据库操作。

这是将新客户插入数据库的端点。

@RestController
public class CustomerController {
    
    @Autowired
    private CustomerRepository customerRepository;
    
    
    @PostMapping(value="/customers", produces = "application/json")
    public ResponseEntity<Customer> addCustomer(@RequestBody Customer customer){
        
        Customer newCustomer = customerRepository.save(customer);       
        
        return new ResponseEntity<Customer>(newCustomer, HttpStatus.OK) ;
    }

测试:

@Test
public void testAddCustomer() {
        
    Customer customer = Mockito.mock(Customer.class);
    customer.setIdCustomer(1L);     
    customer.setName("Pete");
    customer.setAge(35);
    customer.setEmail("pete@test.com");
                
    when(customerRepository.save(customer)).thenReturn((Customer) Stream.of(customer));
        
    CustomerController customerController = new CustomerController();       

    ResponseEntity<Customer> respCustomer = customerController.addCustomer(customer);
        
    assertTrue(respCustomer.getBody().getIdCustomer() != null);
        
}

我在以下行收到空指针异常:

 when(customerRepository.save(customer)).thenReturn((Customer) Stream.of(customer));

【问题讨论】:

    标签: java spring-boot junit mockito spring-data


    【解决方案1】:

    使用

    @Mock private CustomerRepository customerRepository

    在您的测试中使用 mockito API 配置存储库

    【讨论】:

    • @Test 方法的代码是什么?这就是我想要弄清楚的。
    • 我更新了问题,添加了我目前所拥有的内容。
    【解决方案2】:

    应该是这样的

        @Test
        public void testFindTheGreatestFromAllData() {
            DataService dataServiceMock = mock(DataService.class);
            when(dataServiceMock.retrieveAllData()).thenReturn(new int[] { 24, 15, 3 });
            SomeBusinessImpl businessImpl = new SomeBusinessImpl(dataServiceMock);
            int result = businessImpl.findTheGreatestFromAllData();
            assertEquals(24, result);
        }
    

    【讨论】:

    • 我更新了问题,添加了到目前为止我所拥有的不起作用的内容。
    • 在运行测试时检查 customRepository 是否不为空。使用断点和调试模式
    • 是的,它是空的。如何解决?它在类级别自动装配。 public class CustomerControllerTest { @Autowired private CustomerRepository customerRepository;...
    • 现在我注意到我在嘲笑错误的课程。存储库类是需要模拟的类。所以我做了以下更改:1)注释掉@Autowired行; 2) 将 testAddCustomer 方法的第一行更改为 Customer customer = new Customer(); 3) 添加以下行:CustomerRepository customerRepository = Mockito.mock(CustomerRepository.class);现在出现类型转换错误:java.lang.ClassCastException: class java.util.stream.ReferencePipeline$Head 无法转换为 class restapicustomers.model.Customer
    猜你喜欢
    • 1970-01-01
    • 2014-10-23
    • 2017-11-02
    • 2019-11-19
    • 2020-09-18
    • 2019-09-27
    • 2014-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多