我创建了模拟对象并定义了一些规则(当someMethod()
然后doSth()
时)。
最佳做法是什么?创建一个具有此类功能的类返回模拟对象?或者使私有静态方法返回模拟对象?或者自己制作模拟课程?
答案 0 :(得分:5)
如果你发现自己创建了测试类(除了包含实际测试的类),那么你已经打败了使用模拟框架的目的。
在测试用例中创建你的模拟:
@Test
public void testGreetingGenerator() {
Person mockPerson = mock(Person.class);
when(mockPerson.getName()).thenReturn("Alan");
GreetingGenerator greeting = new GreetingGenerator(mockPerson);
assertEquals("Hello Alan", greeting.getGreeting());
}
如果你在许多测试中使用相同的模拟,那么一定要使模拟成为一个字段,并将模拟创建放入@Before
方法。
@Before
public void setUp() {
mockPerson = mock(Person.class);
when(mockPerson.getName()).thenReturn("Alan");
}
@Test
public void testGreetingGenerator() {
GreetingGenerator greeting = new GreetingGenerator(mockPerson);
assertEquals("Hello Alan", greeting.getGreeting());
}
您可以创建"基本"在setUp()
中模拟并在各个测试用例中添加更多模拟行为。请记住,在每次测试之前都会调用setUp()
,因此您可以在每次测试中获得新对象。
如果模拟创建过长而复杂,将其移动到方法(静态或其他方式)中是很好的,如果需要,可以将该方法分解为许多较小的方法。
但是,如果您的测试代码过于复杂,请将其视为警告,可能是测试中的单元有太多依赖项,需要重新设计以便测试。
模拟用于单元测试。在上面的示例中,我正在测试的单元是GreetingGenerator
。我不打算在这里测试Person
,所以最好使用模拟Person
而不是真实模拟Person
。这样,如果Person
的某些内容中断,我的GreetingGenerator
测试将失败,但我的{{1}}测试将继续有效。
但是,这意味着这些测试不会验证您的Person和GreetingGenerator类是否正确地进行了互操作,这就是以及单元测试的原因,您应该集成测试。
如果您知道某个类只适用于值对象,那么使用模拟器的好处不大。