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



我已经构建了一个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
}
}

这段代码很简单,所以我不确定你是否需要对它进行单元测试。但如果你愿意,你可以使用Mockito的mocks的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"论点捕获者";。

最新更新