我创建了模拟对象,并定义了一些规则(someMethod()当时doSth()).
制作它的最佳做法是什么?创建一个具有此类功能的类返回模拟对象?或者使私有静态方法返回模拟对象?或者自己制作模拟课程?
如果你发现自己创建了测试类(除了包含实际测试的类),那么你已经打败了拥有模拟框架的目的.
在您的测试用例中创建您的模拟:
@Test
public void testGreetingGenerator() {
Person mockPerson = mock(Person.class);
when(mockPerson.getName()).thenReturn("Alan");
GreetingGenerator greeting = new GreetingGenerator(mockPerson);
assertEquals("Hello Alan", greeting.getGreeting());
}
Run Code Online (Sandbox Code Playgroud)
如果你在许多测试中使用相同的模拟,那么通过所有方法使模拟成为一个字段,并将模拟创建放入一个@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());
}
Run Code Online (Sandbox Code Playgroud)
您可以setUp()在单个测试用例中创建"基本"模拟并在其中添加更多模拟行为.请记住,setUp()在每次测试之前调用它,这样您就可以在每次测试中获得新鲜对象.
如果模拟创建过于复杂,可以将其移动到方法(静态或其他方式)中,如果需要,可以将该方法分解为许多较小的方法.
但是,如果您的测试代码过于复杂,请将其视为一个警告,即可能测试的单元具有太多的依赖关系,需要重新设计以实现可测试性.
模拟用于单元测试.在上面的例子中,我正在测试的单元是GreetingGenerator.我不打算在Person这里测试,所以最好使用模拟而Person不是真实模拟.这样,如果有关于Person休息的事情,我的Person测试将会失败,但我的GreetingGenerator测试将继续工作.
但是,这意味着这些测试不会验证您的Person和GreetingGenerator类是否正确地进行了互操作,这就是为什么以及单元测试,您应该进行集成测试.
如果你知道一个类只是用于值对象,那么使用mock就没有什么好处.