Mockito的最佳实践

时间:2014-03-20 17:00:48

标签: java mockito

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

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

1 个答案:

答案 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类是否正确地进行了互操作,这就是以及单元测试的原因,您应该集成测试

如果您知道某个类只适用于值对象,那么使用模拟器的好处不大。