我正在使用Mockito在Java中编写单元测试,我想验证某个方法是最后一个调用对象的方法.
我正在测试的代码中做这样的事情:
row.setSomething(value);
row.setSomethingElse(anotherValue);
row.editABunchMoreStuff();
row.saveToDatabase();
Run Code Online (Sandbox Code Playgroud)
在我的模拟中,我并不关心我在行上编辑所有内容的顺序,但是在我保存它之后我不再尝试对它做任何事情是非常重要的.有没有办法做到这一点?
请注意,我不是在寻找verifyNoMoreInteractions:它不会确认saveToDatabase是最后调用的东西,如果我在没有显式验证的行上调用任何内容,它也会失败.我希望能够说出类似的话:
verify(row).setSomething(value);
verify(row).setSomethingElse(anotherValue);
verifyTheLastThingCalledOn(row).saveToDatabase();
Run Code Online (Sandbox Code Playgroud)
如果它有帮助,我将从JMock测试中切换到Mockito:
row.expects(once()).method("saveToDatabase").id("save");
row.expects(never()).method(ANYTHING).after("save");
Run Code Online (Sandbox Code Playgroud) 我正在一个项目中工作,有一个Service类和一个Client充当外观的东西(不知道它是否是设计模式世界中的正确术语,但我会尽力使自己清楚).Service方法可能非常昂贵,因为它们可能与一个或多个数据库进行通信,长检查等等,因此每个Client方法都应该调用一个且只能调用一个Service方法.
Service 类结构是这样的
public class Service {
public void serviceA(){...}
public SomeObject serviceB(){...}
// can grow in the future
}
Run Code Online (Sandbox Code Playgroud)
而且Client应该是这样的
public class Client {
private Service myService; // Injected somehow
public void callServiceA() {
// some preparation
myService.serviceA();
// something else
}
public boolean callServiceB(){...}
}
Run Code Online (Sandbox Code Playgroud)
在测试课中,Client我希望有类似的东西
public class ClientTest{
private Client client; // Injected or instantiated in @Before method
private Service serviceMock …Run Code Online (Sandbox Code Playgroud) Mockito api提供的方法:
Mockito.verifyNoMoreInteractions(someMock);
Run Code Online (Sandbox Code Playgroud)
但是在Mockito中是否有可能声明我不希望与给定模拟器进行更多交互,除了与其getter方法的交互之外?
简单的场景是我测试SUT只更改给定模拟的某些属性并使其他属性未被打开的情况.
在示例中,我想测试UserActivationService在类User的实例上更改属性Active但不对Role,Password,AccountBalance等属性执行任何操作.