Когда использовать Spring Framework во время модульного тестирования - PullRequest
0 голосов
/ 28 апреля 2018

Я новичок в Юнит, Мокито и Спринг. Я пытаюсь понять, когда использовать 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), мы действительно являемся модульным тестированием. Макет все, настроить все, как он должен вести себя. Тогда какой смысл тестировать юнит?

1 Ответ

0 голосов
/ 29 августа 2018

Итак, основное различие между Mockito и Junit (оба для модульного тестирования) заключается в том, что когда у вас нет вызовов методов других классов - вы используете junit. Когда у вас есть поведение внутри вашего метода с вызовом метода другого класса - вы должны создать имитацию и «симулировать» поведение этого вызова, и вы не можете сделать это с помощью junit. Для этого случая вам понадобится mockito или Power Mock. Если вы хотите сделать реальный вызов другого метода - он больше не является модульным тестом, он становится интеграционным тестом. И вам нужно инициализировать контекст пружины отверстия. Надеюсь, это поможет для понимания.

...