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

标签 java unit-testing testing junit easymock

我在 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)

我真的有两个问题......

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

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

最佳答案

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

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

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

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

关于java - 验证完成后,EasyMock 在 tearDown 方法中验证对 mock 的调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57413783/

相关文章:

java - 依赖 Maven 项目的测试失败

testing - 使用 gradle 测试时未找到给定的测试包括

java - 图片下载java的集成测试

java - 在maven项目中添加外部jar

unit-testing - 使用 Gallio 运行 NUnit 测试

java - 通过蓝牙接听来自 PC 的安卓电话

unit-testing - Android Studio 中的多个测试套件

wpf - 单元测试 WPF GUI 框架

java - Java的final关键字在大多数情况下真的需要吗?

java - 如何避免在 Maven 中安装或部署仅测试模块