似乎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进行测试的更好方法是什么?
答案 0 :(得分:2)
您遇到的问题是因为单元测试应为DAMP not DRY。单元测试往往会重演。如果你能以安全的方式删除重复(这样它就不会产生不必要的耦合测试),那就去吧。如果没有,那就不要强迫它。单元测试应该快速而简单......如果不是,那么您将花费太多时间进行测试而不是编写业务价值。
只是我的两分钱。 BTW, the Art of Unit Testing by Roy Osherove是关于单元测试的精彩读物,涵盖了此主题。