0

似乎 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 进行测试的更好方法,它保持 DRY 原则?

4

1 回答 1

2

您遇到的问题是因为单元测试应该是DAMP 而不是 DRY。单元测试往往会重复自己。如果您可以以安全的方式删除重复项(这样它就不会创建不必要的耦合测试),那就去做吧。如果没有,那就不要勉强。单元测试应该快速简单……如果不是,那么您将花费太多时间测试而不是编写业务价值。

只是我的两分钱。顺便说一句,Roy Osherove 的《单元测试艺术》是一本关于单元测试的好书,涵盖了这个主题。

于 2012-06-29T18:10:30.080 回答