单元测试无效控制器和服务方法

时间:2020-09-07 09:25:00

标签: java maven junit restapi

我已经构建了一个REST API,可以在产品数据库上执行基本的CRUD操作,现在我将对控制器和服务层中的所有方法进行单元测试。我已经意识到,诸如addProduct,updateProduct或deleteProduct之类的方法在这两层上都返回void。

在测试服务层时如何模拟存储库,在测试控制器层中的这些方法时如何模拟服务?

控制器方法:

@RequestMapping(method= RequestMethod.POST,value ="/products")
public void addProduct(@RequestBody Product product){
    productService.addProduct(product);
}

服务方法:

public void addProduct(Product product){
    productRepository.save(product);
}

我在需要帮助addProduct()方法的字段中发表了意见。

控制器测试:

package com.product.controllers;

import com.product.entities.Product;
import com.product.services.ProductService;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;

import java.util.ArrayList;
import java.util.List;

import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.when;

@ExtendWith(MockitoExtension.class)
class ProductControllerTest {

@InjectMocks
ProductController productController;

@Mock
ProductService productService;

@Test
public void getHomePage(){
    String homePageText = "Welcome to the home page!";
    assertEquals(homePageText,productController.getHomePage());
}

@Test
public void getAllProducts(){
    
    Product product1 = new Product();
    product1.setId("001");
    product1.setName("TV");
    product1.setPrice(999.99);

    Product product2 = new Product();
    product2.setId("002");
    product2.setName("Mobile");
    product2.setPrice(300D);

    List<Product> listOfProducts = new ArrayList<>();
    listOfProducts.add(product1);
    listOfProducts.add(product2);

    when(productService.getAllProducts()).thenReturn(listOfProducts);
    assertEquals(listOfProducts,productController.getAllProducts());
}

@Test
public void getProductById(){
    
    Product product = new Product();
    product.setId("001");
    product.setName("TV");
    product.setPrice(999.99);

    when(productService.getProductById("001")).thenReturn(product);
    assertEquals(new ResponseEntity<Product> (product, HttpStatus.OK),productController.getProductById("001"));
}

@Test
public void addProduct() {
    
    Product product = new Product();
    product.setId("001");
    product.setName("TV");
    product.setPrice(999.99);

    // need help with this
}
}

服务测试:

package com.product.services;

import com.product.entities.Product;
import com.product.repositories.ProductRepository;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import java.util.ArrayList;
import java.util.List;
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.when;

@ExtendWith(MockitoExtension.class)
public class ProductServiceTest {

@InjectMocks
ProductService productService;

@Mock
ProductRepository productRepository;

@Test
public void getAllProducts() {

    Product product1 = new Product();
    product1.setId("001");
    product1.setName("TV");
    product1.setPrice(999.99);

    Product product2 = new Product();
    product2.setId("002");
    product2.setName("Mobile");
    product2.setPrice(300D);

    List<Product> listOfProducts = new ArrayList<>();
    listOfProducts.add(product1);
    listOfProducts.add(product2);

    when(productRepository.findAll()).thenReturn(listOfProducts);
    assertEquals(listOfProducts, productService.getAllProducts());
}

@Test
public void getProductById() {

    Product product = new Product();
    product.setId("001");
    product.setName("TV");
    product.setPrice(999.99);

    when(productRepository.findById("001")).thenReturn(java.util.Optional.of(product));
    assertEquals(product, productService.getProductById("001"));


}

@Test
public void addProduct() {

    Product product = new Product();
    product.setId("001");
    product.setName("TV");
    product.setPrice(999.99);

    // need help with this
}
}

1 个答案:

答案 0 :(得分:1)

这段代码非常简单,因此我不确定您是否需要对其进行单元测试。但是,如果您愿意,可以使用Mockito的模拟的verify方法。例如,在测试addProduct 时:

@InjectMocks
ProductService productService;

@Mock
ProductRepository productRepository;

// ...

@Test
public void testAddProduct() { 
   Product dummyProduct = new Product();

   productService.addProduct(dummyProduct);

   // eq() is from the Mockito matchers package
   Mockito.verify(productRepository, Mockito.times(1)).save(eq(dummyProduct))
}

这验证了save在模拟存储库中的调用时间为dummyProduct

您可能还想查看Mockito的“参数捕获器”。