【问题标题】:When to use Spring Framework while unit testing单元测试时何时使用 Spring Framework
【发布时间】: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


    【解决方案1】:

    因此,Mockito 和 Junit(两者都用于单元测试)之间的主要区别在于,当您没有调用其他类方法时 - 您使用 junit。当你的方法内部有行为调用另一个类的方法时 - 你必须创建模拟和“模拟”该调用的行为,而你不能用 junit 做到这一点。对于这种情况,您需要 mockito 或 Power Mock。如果你想真正调用另一个方法——它不再是单元测试,而是集成测试。并且您需要初始化一个孔弹簧上下文。希望对理解有所帮助。

    【讨论】:

      猜你喜欢
      • 2011-10-01
      • 2018-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多