EasyMock - 模拟具有其他 class 对象和 .class 作为参数的 class

EasyMock - Mock a class having other class object and .class as parameters

我目前正在使用 EasyMock 并尝试了很多来解决我的问题。

简单的给大家解释一下,我一共有5个class。

来自 Main.java 我正在调用 A.java

的方法
objectOfA.someMethod("String",objectofB, C.class);

在嘲笑时...

expect( objectofA.someMethod( "given some String", Prepared some dummy object of B and passing , C.class ) ).andReturn( objectofResult ).anyTimes();

当我 运行 应用程序给出 AssersionError。

我的问题:

  1. 在expect方法>调用objectofA.someMethod()时,在第二个参数中我创建了一个B的虚拟对象,实际上B有近10个变量,其中一个是随机生成,但在创建虚拟对象时我给出了我自己的一些值,这会成为问题吗?

  2. 第三个参数,我们要传C.class,这个怎么传呢?

  3. 最后在 andReturn() 中我传递了 objectofResult class,在这种情况下我是否需要 parpare Result 的虚拟对象?因为在Result.java中我们有将近20个变量,我真的很难猜到这些值。

在Result.java中我只需要验证一个字符串变量值。

3 天以来我尝试了很多,有人可以帮我解决这个问题吗?

我们无法告诉您什么是您的代码 "right";因为我们没有完整的图片(如果您发布代码,您不应该期望有人会花时间深入研究您的所有代码)。

所以,对于你的问题:

1) +2) 我认为你正在落后。重点是:您告诉 EasyMock 您的 "code under test" 应该进行的调用。

这意味着:你告诉EasyMock应该调用someMethod; EasyMock 将检查实际调用是否符合您的规范。

因此,这实际上取决于您对 B class 的实施。如果您的实际代码通过 someMethod() 传递的 B 对象 等于 您在 EasyMock 暂存中提供的 B 对象;比一切都好。但是如果它们不相等,那么 EasyMock 就会报错。您可以更改它,例如使用匹配器,例如

EasyMock.expect(
  yourMock.someMethod(
    eq("string to match"), anyObject(B.class), ...) 

(其中 eq、anyObject 是 EasyMock 中的静态方法)。

但是问题来了:如果你使用匹配器;你必须在 all 你的参数上使用匹配器。并且(暂时);我不知道适用于 "class" 参数的匹配器。所以,现在我只能建议做这样的事情:

EasyMock.expect(
  yourMock.someMethod("string to match", expectedB, C.class))

其中"expectedB"是您预先设置的B对象;以便它与您的被测代码创建的内容相匹配。为了到达那里,你必须确保你的 B class 作为 "good" equals() 方法。

3) 再次;你的 "dummy result" 能做什么的问题;取决于您的测试代码将如何使用它。

示例:假设您的测试代码将在该结果对象上调用 .toString()。那么你可能要为此做好准备;例如通过使结果对象...成为另一个模拟;期望调用 toString().

长话短说:您使用 EasyMock 指定您希望 "come out" 被测 class 的所有内容;并控制 "flows into" 和 class 在测试中的所有内容。