unit-testing - 干燥 EasyMock 测试

标签 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"),那么这可能不适用。我可以在 EasyMock 中使用 anyTimes()stubReturn() 来避免这个问题。但是,这些方法仅验证方法是否被调用,是否使用特定参数调用,而不是方法是否实际被调用

目前唯一有效的解决方案是复制并粘贴每个测试的期望值并改变参数。 有没有人知道使用 EasyMock 进行测试的更好方法,同时保持 DRY 原则?

最佳答案

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

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

关于unit-testing - 干燥 EasyMock 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11266765/

相关文章:

python - nosetest 的设置方法。 (测试类)

c++ - 我可以将多个 BOOST 单元测试链接到一个测试二进制文件中吗?

performance - 混淆或保护 Jmeter 脚本

android - 如何告诉被测对象使用模拟而不是它自己的变量

python - 模拟文件中导入的类的 __init__

c# - 了解一些单元测试实践

ruby - RSpec allow/expect 与 just expect/and_return

java - 使用对象创建模拟列表

python - 对基于 PySide 的应用程序进行单元和功能测试?

java - Mockito 可以模拟包级可见性接口(interface)吗?