【发布时间】:2018-04-28 01:16:27
【问题描述】:
我是 Junit、Mockito 和 Spring 的新手。我试图了解在单元测试时何时使用 Spring。我可以在不使用 Spring 的情况下对下面的代码进行单元测试。我读过很多文章说 Spring 的好处之一是单元测试。我很困惑,因为我成功地使用 JUnit 和 Mockito 测试了我的代码,那么在哪里以及为什么使用 Spring?
班级Product
public class Product {
}
接口ProductDao
public interface ProductDao {
int getAvailableProducts(Product product);
int orderProduct(Product product, int orderedQuantity);
}
班级ProductServiceTest
public class ProductService {
private ProductDao productDao;
public void setProductDao(ProductDao productDao) {
this.productDao = productDao;
}
public boolean buy(Product product, int orderedQuantity) throws InsufficientProductsException {
boolean transactionStatus = false;
int availableQuantity = productDao.getAvailableProducts(product);
if (orderedQuantity > availableQuantity) {
throw new InsufficientProductsException();
}
productDao.orderProduct(product, orderedQuantity);
transactionStatus = true;
return transactionStatus;
}
}
班级ProductServiceTest
import org.junit.Before;
import org.junit.Test;
import org.mockito.InOrder;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
public class ProductServiceTest {
private ProductService productService;
private ProductDao productDao;
private Product product;
private int purchaseQuantity = 15;
@Before
public void setupMock() {
productService = new ProductService();
product = mock(Product.class);
productDao = mock(ProductDao.class);
productService.setProductDao(productDao);
}
@Test
public void testBuy() throws InsufficientProductsException {
int availableQuantity = 30;
System.out.println("Stubbing getAvailableProducts(product) to return " + availableQuantity);
when(productDao.getAvailableProducts(product)).thenReturn(availableQuantity);
System.out.println("Calling ProductService.buy(product," + purchaseQuantity + ")");
productService.buy(product, purchaseQuantity);
System.out.println("Verifying ProductDao(product, " + purchaseQuantity + ") is called");
verify(productDao).orderProduct(product, purchaseQuantity);
System.out.println("Verifying getAvailableProducts(product) is called at least once");
verify(productDao, atLeastOnce()).getAvailableProducts(product);
System.out.println("Verifying order of method calls on ProductDao: First call getAvailableProducts() followed by orderProduct()");
InOrder order = inOrder(productDao);
order.verify(productDao).getAvailableProducts(product);
order.verify(productDao).orderProduct(product, purchaseQuantity);
}
}
JUnit 和 Mockito 的区别?
如果我们模拟所有内容(例如,ProductService 中的 buy 方法中的所有内容)我们真的是单元测试。模拟一切设置一切预期的行为方式。那么单元测试的重点是什么?
【问题讨论】:
标签: java spring-mvc junit mockito spring-mvc-test