java - 模拟对象单元测试遇到问题

标签 java eclipse easymock

我正在摆弄模拟对象,但在设置单元测试来检查列表是否已正确排序时遇到问题。这样做的自负是我正在 mock 一个时钟,但仅仅使用 times() 方法是行不通的。该列表应按升序排列,但获取第一个索引只会返回最后设置的值。

作为引用,这是一个有效的模拟测试,用于测试午夜设置的时钟:

@Test
public void shouldSetAtMidnight() {
    expect(mock.instant()).andReturn(Instant.from(this.midnight));

    expect(mock.getZone()).andReturn(this.timeZone);

    replay(mock);

    this.st.setDesiredValue(72);
    SetPoint[] sched = this.st.getSchedule();

    verify(mock);

    assertEquals(LocalTime.MIDNIGHT, sched[0].getScheduledTime());
}

在这里,设置所需值的唯一重要之处在于它将 SetPoint 添加到数组中(setDesiredValue 创建一个具有 int 和 LocalTime 的 SetPoint)。这就是我遇到困难的地方:

@Test
public void shouldOrderTwoSetPointsAddedOutOfOrder() {
    expect(mock.instant()).andReturn(Instant.from(this.midnight)).times(2);

    expect(mock.getZone()).andReturn(this.timeZone).times(2);

    replay(mock);

    this.st.setDesiredValue(73);
    this.st.setDesiredValue(71);
    SetPoint[] schedule = this.st.getSchedule();

    verify(mock);

    assertEquals(71, schedule[0].getTemp());
}

setDesiredValue 应该将 int 值与 LocalTime 关联起来,在本例中应该是午夜。然后,它将具有这些特征的 SetPoint 添加到列表中,并调用 Collection 的 sort() 方法对它们进行从低到高的排序。现在,我假设我的问题是我将两个值与完全相同的时间关联起来,尽管为两个期望调用了 times(2) ,但我最近刚刚开始使用模拟对象,并且不了解他们知道从这里该去哪里。运行此测试返回 73 而不是 71。

最佳答案

你的假设是正确的。当您说 .andReturn(Instant.from(this.midnight)).times(2) 时,传递给 .andReturn 的确切值将重复两次。

您可以执行.andReturn(Instant.from(this.midnight)).andReturn(Instant.from(this.midnight)),这将为您提供两个瞬间。但作为一般规则,这对于单元测试来说是非常糟糕的形式。 Instant.from(this.midnight) 来自测试外部,因此您无法预测两次调用此函数是否会产生相同的值或不同的值,从而使测试具有不确定性。对于集成测试来说还可以,对于单元测试则不行,因为在单元测试中您将使用模拟。最好使用实数,例如 .andReturn(Instant.fromEpochSecond(10)).andReturn(Instant.fromEpochSecond(15))

您没有提供有关 st 的大量详细信息以及您认为测试不应返回 73 而不是 71 的任何原因。

关于java - 模拟对象单元测试遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32983154/

相关文章:

eclipse - 如何在运行时制作用户定义代码的控制流图

java - 使用 JUnit 和 EasyMock Java 测试 Servlet

java - 验证 void 方法调用

java - 反序列化对象时忽略嵌套的 json 字段

Java-使一种特定颜色透明

java - Android 中的外部 JAR 错误

java - 重命名文件(如果存在)

java - 延迟 EasyMock 验证

java - 找不到MapReduce停用词

java - 你能让 JToolBar 不可分离吗?