【发布时间】:2021-08-09 12:54:59
【问题描述】:
我只是在尝试使用 Spock 测试框架,根据文档,它看起来比 JUnit 更好,并尝试编写简单的测试用例,但不知何故它不起作用。
类:
public class SwapTwoNumber {
public void swapNumber(int a,int b){
a =a+b;
b=a-b;
a=a-b;
}
}
Spock 测试 Groovy:
import spock.lang.Specification
class SwapTwoNumberTest extends Specification{
def "swap to number as given. #a and #b"() {
given:
int a = 5
int b = 6
when:
SwapTwoNumber sw =Mock()
sw.swapNumber(a,b)
then:
a==6
b==5
}
}
【问题讨论】:
-
“它不工作”是什么样的?
-
请注意,Java 是按值调用的,因此将
a和b传递给swapNumber实际上不会对调用者执行任何可见的操作。a仍为 5,b仍为 6。您需要将引用(也是一种值)传递给可变容器,例如AtomicInteger(作为一个简单的例子,它不是该类存在的实际用例)然后在这些上调用set(...)。 -
您对
Mock()的呼叫是否正确?你不应该嘲笑你正在测试的东西(更不用说你的代码很简单,没有必要模拟任何东西) -
同意@mattfreake,但托马斯正确地指出了实施。
-
这段代码在很多层面上都是错误的,我几乎不知道从哪里开始:交换动作是神秘的,只是为了保存一个临时变量。您认为您将在这里优化什么?然后你模拟被测类,让
swapNumber什么都不做!您不了解int和Integer这样的原始类型或不可变类型。您使用void方法,其唯一的副作用是修改内部状态(这适用于对象类型,不适用于原语或其不可变的包装类)。只需先学习编程基础知识,然后再专注于测试。