Mockito的最佳实践

use*_*883 1 java mockito

我创建了模拟对象,并定义了一些规则(someMethod()当时doSth()).

制作它的最佳做法是什么?创建一个具有此类功能的类返回模拟对象?或者使私有静态方法返回模拟对象?或者自己制作模拟课程?

sli*_*lim 6

如果你发现自己创建了测试类(除了包含实际测试的类),那么你已经打败了拥有模拟框架的目的.

在您的测试用例中创建您的模拟:

 @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就没有什么好处.