【发布时间】:2015-01-15 12:01:46
【问题描述】:
我在 spock 框架中编写了一些单元测试。但是我的测试总是正确的,即使我传递了不正确的值。
class CalculatorTest extends Specification {
def "Method should return roman number"() {
given:
CalculatorApi romanCalculator = Mock()
when: "I add two numbers as integer"
romanCalculator.add(2, 2)
then: "Method should return roman number as String"
romanCalculator.add(2, 2) >> 32131
}
方法“add”应该返回字符串。在这个测试中,一个方法应该返回 Integer。
public class RomanCalculator implements CalculatorApi {
private RomanConverter romanConverter;
public RomanCalculator() {
this.romanConverter = new RomanConverter();
}
public String add(int one, int two) throws OperationFail {
int number = one + two;
try {
return romanConverter.convertNumber(number);
} catch (NumberNotFound e) {
throw new OperationFail(e.getMessage());
}
}
public class RomanConverter implements ConverterApi {
public String convertNumber(Integer number) throws NumberNotFound {
switch(number) {
case 1:
return "I";
case 2:
return "II";
case 3:
return "III";
case 4:
return "IV";
case 5:
return "V";
case 6:
return "VI";
case 7:
return "VII";
case 8:
return "VIII";
case 9:
return "IX";
case 10:
return "X";
default:
throw new NumberNotFound();
}
}
为什么这个方法不起作用?我刚开始用 mock 学习单元测试。
【问题讨论】:
-
这段代码是什么意思? 'romanCalculator.add(2, 2) >> 32131'
-
嘲笑你正在测试的课程毫无意义。
-
这意味着带有参数 2、2 的方法应该返回值 32131
-
所以你在 then 部分模拟 romanConverter 并且它总是返回 32131。正如 Vargan 在回答中所说:不要模拟被测类,如果你模拟不要在然后分支,但在设置/给定部分(如果没有更好的地方),你仍然缺少要测试的断言。