【问题标题】:DRYing Up EasyMock Tests干燥 EasyMock 测试
【发布时间】:2012-06-29 18:03:16
【问题描述】:

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 原则?

【问题讨论】:

    标签: unit-testing testing mocking dry easymock


    【解决方案1】:

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

    只有我的两分钱。 BTW, the Art of Unit Testing by Roy Osherove 是一本关于单元测试的好书,涵盖了这个主题。

    【讨论】:

    • 感谢您的见解。我一定要读一读那本书。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-28
    • 1970-01-01
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    • 2011-11-26
    • 1970-01-01
    相关资源
    最近更新 更多