【发布时间】: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