【问题标题】:Why is this Mockito test failing?为什么这个 Mockito 测试失败了?
【发布时间】:2015-08-08 11:32:32
【问题描述】:

对 Mockito 完全陌生,这是我开始的:

被测类User.java:

package com.test.mockito;

public class User {
    private ProductManager productManager;
    public boolean buy(Product product, int quantity) throws InsufficientProductsException {
        boolean transactionStatus=false;
        int availableQuantity = productManager.getAvailableProducts(product);
        if (quantity < availableQuantity) {
            throw new InsufficientProductsException();
        }
        productManager.orderProduct(product, quantity);
        transactionStatus=true;
        return transactionStatus;
    }
    public void setProductManager(ProductManager productManager) {
        this.productManager = productManager;
    }
}

模拟对象:Product.java

package com.test.mockito;

public class Product {
}

ProductManager.java

package com.test.mockito;

public interface ProductManager {
    int getAvailableProducts(Product product);
    int orderProduct(Product product, int num);
}

异常类:InsufficientProductsException.java

package com.test.mockito;

public class InsufficientProductsException extends Exception {
    private static final long serialVersionUID = 1L;
}

最后是测试代码。

package com.test.mockito;

import org.junit.Before;
import org.junit.Test;
import static org.mockito.Mockito.*;

public class UserTest {
    private User user;
    private ProductManager productManager;
    private Product product;
    private int purchaseQuantity = 15;


    @Before
    public void setupMock() {
        user = new User();
        productManager = mock(ProductManager.class);
        user.setProductManager(productManager);
        product = mock(Product.class);

    }

    @Test(expected=InsufficientProductsException.class)
    public void purchaseButInsufficientAvailableQuantity() throws InsufficientProductsException {
        int availableQuantity = 3;
        System.out.println("Train getAvailableProducts(product) to return " + availableQuantity);
        when(productManager.getAvailableProducts(product)).thenReturn(availableQuantity);
        try {
            System.out.println("User.buy(" + purchaseQuantity + ") should fail with InsufficientProductsException");
            user.buy(product,purchaseQuantity);
        } catch (InsufficientProductsException e) {
            System.out.println("InsufficientProductsException is thrown");
            verify(productManager, times(0)).orderProduct(product, purchaseQuantity);
            System.out.println("Verified orderProduct(product, " + purchaseQuantity + ") is not called");
            throw e;
        }
    }

}

测试失败并且出现是因为用户没有抛出预期的 InsufficientProductsException。 Maven 测试报告:

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running com.test.mockito.UserTest
Train getAvailableProducts(product) to return 3
User.buy(15) should fail with InsufficientProductsException
Tests run: 1, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 3.66 sec <<< FAILURE!

Results :

Failed tests:   purchaseButInsufficientAvailableQuantity(com.test.mockito.UserTest): Expected exception: com.test.mockito.InsufficientProductsException

Tests run: 1, Failures: 1, Errors: 0, Skipped: 0

这可能看起来很傻,但真的无法理解我做错了什么。

【问题讨论】:

    标签: java unit-testing testing junit mockito


    【解决方案1】:

    您的检查方式错误 - 如果quantity availableQuantity 多,而不是少于 availableQuantity,您应该抛出异常。

    即,您应该替换此检查:

    if (quantity < availableQuantity) {
        throw new InsufficientProductsException();
    }
    

    有了这个:

    if (quantity > availableQuantity) {
        throw new InsufficientProductsException();
    }
    

    【讨论】:

      猜你喜欢
      • 2021-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-31
      相关资源
      最近更新 更多