我有一个非常复杂的方法,我想测试它的行为(使用 Mockito 和 JUnit)。这个方法将一个对象(我们称之为它的类型State
)作为输入,并且应该考虑几个不同的状态变量来决定它的输出。
例如,考虑以下规范(s
是State
类的模拟):
- 如果
s.varOne
已设置,则返回其值。 - 否则,如果
s.varTwo
已设置,则返回它。 - 否则,如果
s.varThree
设置,调用s.update(s.varThree)
然后返回s.varOne
,它现在将有一个值(即使它没有在阶段 1。) - 否则,抛出错误。
为了正确测试案例 3,我想设置s
对象,以便s.varOne
和s.varTwo
都未设置开始,但如果(且仅当!) sut 调用s.update(s.varThree)
,然后s.varOne
返回一些东西。
有没有在 Mockito 中设置这种行为的好方法?
我考虑过为 设置一些返回值链s.varOne
,然后验证调用的顺序是否与输出的顺序相对应(当然还有 sut 的返回值是否正确),但这感觉很脏; 如果我然后更改方法以以其他方式计算其返回值,该方法调用s.varOne
不同的次数但不更改其输出,那么即使功能相同,测试也会失败。
我理想的解决方案是一种可以为模拟对象添加一些“延迟”设置的方法,该设置在 sut 调用该s.update()
方法时运行,但我无法找到实现该目标的方法。