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