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);
}
}
答案 0 :(得分:8)
如果你想测试checkAndReturnDoubleIfOk
,你不应该嘲笑它。
你在做什么是错的 - 你是想嘲笑合作者,而不是被测试的班级。首先,您创建一个Product
的模拟,其中包含所有方法(checkAndReturnDoubleIfOk
),然后尝试将其用作原始类。实际上你正在测试checkAndReturnDoubleIfOk
的模拟实现。
您的代码应该是这样的:
@Test(expected = WrongCostFormat.class)
public void shouldThrowNumberFormatException() {
Product p = new Product();
p.checkAndReturnDoubleIfOk("1.234");
}
当被测试的类使用另一个类时,应该被模拟的是另一个类。然后,您应该验证正在测试的类是否与模拟类正确交互。
答案 1 :(得分:4)
当你模拟一个对象时,你并没有真正调用模拟对象的方法,因此不会抛出代码内部的异常。
模拟的目的是当你想测试你的代码的一部分,然后“模拟”它的某些其他部分,以便按照你需要的方式进行测试 - 你不应该模仿你的对象想要测试,但是需要测试。
这里没有真正的需要嘲笑,如果你不想测试checkAndReturnDoubleIfOk
,只需从真实对象运行它,而不是模拟它