1

仕事中のプロジェクトで、本当に厄介なバグ/機能に遭遇しました。私は解決策を見つけましたが、なぜそれが起こっているのか本当に興味があります。プロジェクトには、単純な古い 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() ブロックで適切に終了していないということですが、間違っている可能性があります。

4

0 に答える 0