在一个工作项目中,我遇到了一个真正烦人的bug /功能。我发现了一个解决方案,但我真的很好奇它为什么会发生。这一切都必须这样做,该项目有一些用unitils而不是简单的旧EasyMock编写的遗留测试。考虑下面两个测试类按顺序运行。
public class Test1{
@TestedObject
private MyService myService;
@InjectIntoByType protected Mock<MyRepository> myRepo;
@Test
public void aTest(){
myService.doSomething();
myRepo.assertNotInvoked().getById(EasyMock.anyLong());
}
}
public class Test2{
private IMocksControl control;
private MyOtherService myService;
private MyOtherRepo myRepo;
public Test2(){
control = EasyMock.createControl();
myRepo = control.createMock(MyOtherRepo.class);
myService = new MyOtherService(myRepo);
}
@Test
public void aTest(){
myRepo.getById(5L);
EasyMock.expectLastCall().andReturn(new MyObject(5L));
control.replay()
MyObject result = myService.doSomething();
control.verify()
Assert.assertEquals(5L,result.getId().longValue);
}
}
当我分别运行两个测试时,它们运行正常。两个绿色都工作。但是,如果我在彼此之后立即运行它们,则第二次测试失败 java.lang.IllegalStateException:x匹配预期,y记录错误(x和y是当前的整数,因为这是一个假的例子,我没有实数)。
通过将assertNotInvoked行更改为:myRepo.assertNotInvoked()。getById(null);
我“修复”了这个问题。这当然不是一个真正的解决办法,我只是绕过了匹配器的使用,我想知道我是否只是没有打破传统的测试案例...是否有任何人有足够的EasyMock + Unitils经验可以帮帮我理解这个?我最好的“猜测”是AssertNotInvoked没有使用EasyMock.replay(),EasyMock.verify()块正确结束......但我可能错了。