我正在编写一个需要测试对象的测试用例,但该对象需要大量配置才能正常工作。
现在我有5 或 6 个接口,其中包含许多方法,其中只有少数与测试该对象相关。
所以问题基本上是正确使用Mocking框架来模拟配置相关接口还是我应该在测试用例中实现接口以提供数据?
Mockito.mock(IConfiguration.class); //is this a proper use?
编辑:
我在一些地方读过关于不使用模拟来模拟简单对象的评论。在我的情况下,对象很简单,但界面很胖。所以有很多方法。
我正在编写一个需要测试对象的测试用例,但该对象需要大量配置才能正常工作。
现在我有5 或 6 个接口,其中包含许多方法,其中只有少数与测试该对象相关。
所以问题基本上是正确使用Mocking框架来模拟配置相关接口还是我应该在测试用例中实现接口以提供数据?
Mockito.mock(IConfiguration.class); //is this a proper use?
编辑:
我在一些地方读过关于不使用模拟来模拟简单对象的评论。在我的情况下,对象很简单,但界面很胖。所以有很多方法。
是的,这是一个非常好的用例,因为实例化这些接口的实现通常并非易事。
配置应该是一个非常简单的框架,它必须允许轻松地为测试创建实例——事实上,每秒有数十万种不同的配置。或者,如果我的代码不支持数百个配置选项来调整其行为,我为什么需要一个配置框架?
但不幸的是,编写配置框架的人经常会丢失这种简单的智慧。
在测试任何使用您的实现的类时configuration related interfaces,您应该使用mock这些配置接口的实现。
将subject under test (SUT)调用您的配置类的方法来完成它的工作。因此,对于给定的输入,您只需要在从您正在测试的方法中调用配置类的方法之前,对调用的行为进行存根:
public class ServiceTest {
IConfiguration mockConfig;
private ServiceUnderTest serviceUnderTest;
@Before
public void setup() {
serviceUnderTest = new ServiceUnderTest();
mockConfig = mock(IConfiguration.class);
serviceUnderTest.setConfig(mockConfig);
}
@Test
public void test(){
//Here you can stub the behavior of method calls on "IConfiguration" before they're called
}
}
当您正在测试ServiceUnderTest单元时,您不需要真正实现配置类。您只需要对这些配置类的方法调用行为进行存根。