干燥EasyMock测试

时间:2012-06-29 18:03:16

标签: unit-testing testing mocking dry easymock

似乎EasyMock测试倾向于遵循以下模式:

@Test
public void testCreateHamburger()
{
  // set up the expectation
  EasyMock.expect(mockFoodFactory.createHamburger("Beef", "Swiss", "Tomato", "Green Peppers", "Ketchup"))
    .andReturn(mockHamburger);

  // replay the mock
  EasyMock.replay(mockFoodFactory);

  // perform the test
  mockAverager.average(chef.cookFood("Hamburger"));

  // verify the result
  EasyMock.verify(mockFoodFactory);
}

这适用于一个测试,但是当我想在另一个方法中再次测试相同的逻辑时会发生什么?我的第一个想法是做这样的事情:

@Before
public void setUp()
{
  // set up the expectation
  EasyMock.expect(mockFoodFactory.createHamburger("Beef", "Swiss", "Tomato", "Green Peppers", "Ketchup"))
    .andReturn(mockHamburger);

  // replay the mock
  EasyMock.replay(mockCalculator);
}

@After
public void tearDown()
{
  // verify the result
  EasyMock.verify(mockCalculator);
}

@Test
public void testCreateHamburger()
{
  // perform the test
  mockAverager.average(chef.cookFood("Hamburger"));
}

@Test
public void testCreateMeal()
{
  // perform the test
  mockAverager.average(chef.cookMeal("Hamburger"));
}

这种方法存在一些基本问题。首先是我的方法调用不能有任何变化。如果我想测试person.cookFood("Turkey Burger"),我的设置方法将不起作用。第二个问题是我的设置方法需要调用createHamburger。如果我致电person.cookFood("Salad"),那么这可能不适用。我可以使用anyTimes()stubReturn()与EasyMock来避免此问题。但是,这些方法只验证是否调用某个方法,使用某些参数调用它,如果实际调用该方法则不会。

迄今为止唯一可行的解​​决方案是复制和粘贴每个测试的期望并改变参数。 是否有人知道使用EasyMock进行测试的更好方法是什么?

1 个答案:

答案 0 :(得分:2)

您遇到的问题是因为单元测试应为DAMP not DRY。单元测试往往会重演。如果你能以安全的方式删除重复(这样它就不会产生不必要的耦合测试),那就去吧。如果没有,那就不要强迫它。单元测试应该快速而简单......如果不是,那么您将花费太多时间进行测试而不是编写业务价值。

只是我的两分钱。 BTW, the Art of Unit Testing by Roy Osherove是关于单元测试的精彩读物,涵盖了此主题。