验证完成后,EasyMock 在 tearDown 方法中验证对 mock 的调用

EasyMock verifying calls to mock in tearDown method after verify finished

我在 EasyMock 测试中看到我不理解的不一致行为。

我的第一个测试通过了..

public class MockATest {

   private final AtomicLong aMock = createStrictMock(AtomicLong.class);

   @Before
   public void setUp() {
      aMock.set(101L);
   }

   @After
   public void tearDown() {
      aMock.set(999L);
   }

   @Test
   public void testA() {
      reset(aMock);
      replay(aMock);
      // TODO : test stuff here
      verify(aMock);
   }

}

..但我的第二次测试失败了...

public class MockBTest {

   private final List<Long> bMock = createStrictMock(List.class);

   @Before
   public void setUp() {
      bMock.add(101L);
   }

   @After
   public void tearDown() {
      bMock.add(999L);
   }

   @Test
   public void testB() {
      reset(bMock);
      replay(bMock);
      // TODO : test stuff here
      verify(bMock);
   }

}

失败原因是

Unexpected method call List.add(999)

我真的有 2 个问题...

  1. 为什么 2 个测试的行为不同?
  2. 为什么tearDown方法中的add(999L)在testB方法中的校验已经完全完成后还在校验?

(我知道我可以通过在验证(bMock)之后添加另一个重置(bMock)来完成这项工作,但我不确定这是否只是为了避免这个问题)

  1. 为什么 2 个测试的行为不同?

因为 AtomicLong.set 被键入 void AtomicLong.set(long) 所以它是一个无效的方法。录音很好。但是,List.add 的类型是 boolean List.add(E),因此它不是无效方法。记录非空方法的正确方法是 expect(list.add(101L)).andReturn(true).

  1. 为什么tearDown方法中的add(999L)在testB方法中的校验已经完全完成后还在校验?

因为它永远不会进入 testB()。 EasyMock 在 setUp() 中对 bMock.add(101L) 的调用抛出错误,因此它直接转到 tearDown 也失败并隐藏到 setUp().

的异常