【问题标题】:EasyMock unclear error: "expected: 1, actual: 1"EasyMock 不清楚的错误:“预期:1,实际:1”
【发布时间】:2013-12-25 07:07:29
【问题描述】:

我的测试失败了

java.lang.AssertionError: 
  Expectation failure on verify:
    A.logon(null): expected: 1, actual: 1
    at org.easymock.internal.MocksControl.verify(MocksControl.java:226)
    at org.easymock.EasyMock.verify(EasyMock.java:2080)
    at com.ATest.test

这个错误意味着什么?为什么会发生?请提出建议。

【问题讨论】:

  • 你能分享产生这个错误的代码吗?
  • 请出示您的代码。 "1" != 1 有时是"1" != "1"
  • 请确认您在 mock 中指定的 agruments 与对 mock 的调用相同。会有一个模拟调用,但它可能与您提供给期望调用的确切规范不匹配。
  • 我的测试使用了导致该错误的多线程类。见stackoverflow.com/questions/12159/…
  • @uditbansal 可能是对的。但是代码示例和您收到的完整异常将有助于确认:) 此外,如果您期望 null,请不要忘记在期望中使用 EasyMock.isNull(MyClass.class)。你可能会收到一个空对象(不是空的 MyClass),它会抛出这种类型的错误。

标签: java testing easymock


【解决方案1】:

我有类似的错误。事实证明,该方法是在不同的线程上调用的。使方法在同一个线程中执行解决了这个问题。

【讨论】:

    【解决方案2】:

    以下是潜在的解决方案:

    1. 如果你的代码是多线程的,试试How should I unit test threaded code?

    2. 如果您使用 createStrictMock,您可能需要确保方法调用的顺序正确,否则它可能会返回类似“预期:1,实际:1”或“预期:至少 0”的内容,实际:1"

    【讨论】:

      【解决方案3】:

      您看到的只是toString() 方法在两个参数上调用的结果。所以实际上你可能会做以下任何组合:

      assertEquals(1L, 1);
      assertEquals("1", 1);
      assertEquals('1', 1);
      assertEquals(customObject, 1);
      

      【讨论】:

        【解决方案4】:

        需要更多代码

        我们需要更多代码才能得到明确的答案,所以在此之前这是我最好的猜测。

        创建一个模拟类

        您在测试中的某处使用PowerMockEasyMock 模拟了A 类,类似于:

        A mockedA = EasyMock.createMock(A.class);
        

        模拟类的预期行为

        因此,在您的特定测试期间发生的模拟类 A 上的所有行为(这里再次缺少代码)都应该是:

        final String someValue = "someValue";
        EasyMock.expect(mockedA.logon(EasyMock.isA(String.class))).andReturn(someValue)
        

        我完全猜测 logon 方法的签名,因为我不知道您的 A 类实现。在我的猜测中,logon 方法需要一个 String 参数(实际上可以是任何类或原语)并返回另一个 String 值。

        匹配

        如果您要匹配另一个参数,例如 B 类的参数,您需要将上述代码更新为:

        EasyMock.expect(mockedA.logon(EasyMock.isA(B.class))).andReturn(someValue)
        

        返回参数的类型也可以这样说,如果它是 C 类型,只需为 someValue 最后一个参数实例化一个 C 类对象。

        不清楚的错误

        您有一个正确的观点,即错误在某些情况下非常不清楚。您正在匹配的东西在您的测试中接受了 null 的参数对象。

        现在null 可以通过多种方式匹配,例如使用固定的null 值或EasyMock.isA(class)。这可能是您的测试中出现问题的地方,请进行以下实验:

        EasyMock.expect(mockedA.logon(null)).andReturn(someValue)
        EasyMock.expect(mockedA.logon(EasyMock.isA(SomeClass.class)).andReturn(someValue)
        EasyMock.expect(mockedA.logon(EasyMock.isNull(SomeClass.class)).andReturn(someValue)
        EasyMock.expect(mockedA.logon(aVariableHoldingNull)).andReturn(someValue)
        EasyMock.expect(mockedA.logon(EasyMock.eq(aVariableHoldingNull)).andReturn(someValue)
        EasyMock.expect(mockedA.logon(EasyMock.anyObject(SomeClass.class)).andReturn(someValue)
        EasyMock.expect(mockedA.logon(EasyMock.isNull()).andReturn(someValue)
        

        而且这个列表还远未完成。还要确保将您的解决方案回复给我们,以便社区可以从中学习。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-04-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多