【发布时间】:2017-07-13 20:27:18
【问题描述】:
我正在一个项目中使用 Service 类和某种 Client 作为外观(不知道它是否是 设计模式世界中的正确术语,但我会尽量让自己清楚)。 Service 的方法可能非常昂贵,因为它们可能与一个或多个数据库进行通信、长时间检查等等,因此每个 Client 方法应该调用一个且只有一个 Service 方法。
Service 类结构类似于
public class Service {
public void serviceA(){...}
public SomeObject serviceB(){...}
// can grow in the future
}
Client 应该是这样的
public class Client {
private Service myService; // Injected somehow
public void callServiceA() {
// some preparation
myService.serviceA();
// something else
}
public boolean callServiceB(){...}
}
在Client 的测试类中,我想要类似的东西
public class ClientTest{
private Client client; // Injected or instantiated in @Before method
private Service serviceMock = mock(Service.class);
@Test
public void callServiceA_onlyCallsServiceA() {
client.callServiceA();
????
}
}
在???? 部分,我想要类似verifyOnly(serviceMock).serviceA() 的内容“验证serviceMock.serviceA() 仅被调用一次,并且没有调用Service 类中的其他方法”。在 Mockito 或其他一些模拟库中是否有类似的东西?我不想对每种方法都使用verify(serviceMock, never()).serviceXXX(),因为正如我所说,Service 类将来可能会增长,我必须在每个测试中添加验证(对我来说这不是一个快乐的任务)所以我需要更一般的东西。
提前感谢您的回答。
编辑 #1
这篇文章和possible duplicate 的区别在于答案添加了样板代码,这在我的情况下是不需要的,因为这是一个非常大的项目,我必须添加尽可能少的代码。
此外,verifyNoMoreInteractions 可能是一个不错的选择,即使每次测试都不鼓励使用它,也不需要额外的样板代码。
总而言之,possible duplicate 并没有解决我的问题。
还有一个问题:我正在为另一个团队编写的代码编写测试,我自己没有遵循 TDD 过程,所以我的测试应该是额外的防御,如this article 中所述verifyNoMoreInteractions 的模拟文档。我正在测试的方法通常很长,所以我需要检查被测方法是否只调用必要的服务而不调用其他服务(因为它们很昂贵,正如我所说)。也许verifyNoMoreInteractions 现在已经足够好了,但我希望看到同一个 API 创建者团队不会因为每次测试而气馁!
希望这有助于澄清我的观点和问题。最好的问候。
【问题讨论】:
-
@GonzaloMatheu:这是一个很好的重复,因为这个问题是类似的,但问题比这更深一些。