仕事中のプロジェクトで、本当に厄介なバグ/機能に遭遇しました。私は解決策を見つけましたが、なぜそれが起こっているのか本当に興味があります。プロジェクトには、単純な古い EasyMock の代わりに unitil で記述されたレガシー テストが含まれている必要があります。次の 2 つのテスト クラスが順番に実行されたとします。
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);
}
}
両方のテストを別々に実行すると、正常に実行されます。どちらも緑色で、どちらも機能しています。ただし、それらをすぐに実行すると、2 番目のテストは java.lang.IllegalStateException: x matchers expected, y records エラーで失敗します (x と y はもちろん int です。これは偽の例であるため、実数はありません)。
assertNotInvoked 行を myRepo.assertNotInvoked().getById(null); に変更して、これを「修正」しました。
もちろん、これは実際には修正ではありません。マッチャーの使用を回避しただけで、レガシーテストケースを壊していないのではないかと思っています... EasyMock + Unitilsの経験が十分にある人はいますか理解するのに役立ちますこれ ?私の最善の「推測」は、AssertNotInvoked が EasyMock.replay()、EasyMock.verify() ブロックで適切に終了していないということですが、間違っている可能性があります。