繁体   English   中英

模拟对象不起作用

[英]Mocked object doesn't work

double checkAndReturnDoubleIfOk(String stringToCheck) {
        double price = 0;
        try {
            price = Double.valueOf(stringToCheck);
        } catch (NumberFormatException e) {
            System.err.println("Price is not a number");
            return -1;
        }
        String[] array = stringToCheck.split("\\.");
        if (array[1].length() < 3 & price > 0) {
            return price;
        } else {
            throw new WrongCostFormat();
        }

    }

@Test(expected = WrongCostFormat.class)
    public void shouldThrowNumberFormatException() {

        Product mock = mock(Product.class);
        double number = mock.checkAndReturnDoubleIfOk("1.234");     

    }

我是JUnit和Mockito世界的新手,无法弄清楚,为什么测试失败了。 有什么建议么? 我调试了测试文件,似乎数字是0.0而不是抛出异常...包异常;

public class WrongCostFormat extends RuntimeException {

    public WrongCostFormat() {
        super();
    }

    public WrongCostFormat(String s) {
        super(s);
    }

    public WrongCostFormat(String s, Throwable throwable) {
        super(s, throwable);
    }

    public WrongCostFormat(Throwable throwable) {
        super(throwable);
    }

}

如果你想测试checkAndReturnDoubleIfOk你不应该嘲笑它。

你在做什么是错的 - 你是想模仿合作者,而不是被测试的课程。 首先,您创建一个模拟Product的模型,其中包含所有方法( checkAndReturnDoubleIfOk也是checkAndReturnDoubleIfOk ),然后尝试将其用作原始类。 实际上你正在测试checkAndReturnDoubleIfOk实现。

你的代码应该是这样的:

@Test(expected = WrongCostFormat.class)
public void shouldThrowNumberFormatException() {
    Product p = new Product();
    p.checkAndReturnDoubleIfOk("1.234");     
}

当被测试的类使用另一个类时,应该被模拟的是另一个类。 然后,您应该验证正在测试的类是否已与模拟类正确交互。

当你模拟一个对象时,你并没有真正调用模拟对象的方法,因此不会抛出代码内部的异常。

模拟的目的是当你想要测试代码的一部分时,并“模拟”它的其他部分,以便按照你需要的方式进行测试 - 你不应该模拟你想要测试的对象,但是对象。

这里没有真正需要checkAndReturnDoubleIfOk ,如果你不想测试checkAndReturnDoubleIfOk ,只需从真实对象运行它,而不是checkAndReturnDoubleIfOk

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM