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

时间:2016-04-13 12:30:34

标签: java mocking easymock

我目前正在使用EasyMock并尝试修复我的问题。

让我用简单的话来解释你,我总共有5个班。

  • Main.java
  • A.java
  • B.java
  • C.java
  • Result.java

来自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. 在期望方法中>在调用objectofA.someMethod()时,在第二个参数中我创建了一个B的虚拟对象,实际上B有近10个变量,其中一个将随机生成,但在创建虚拟对象时,我给出了一些我自己的值,这会有问题吗?

  2. 第3个参数,我们必须通过C.class,我们怎么能通过这个?

  3. 最后在andReturn()中我传递了objectofResult类,在这种情况下我是否需要包含Result的虚拟对象?因为在Result.java中我们有近20个变量,我很难猜测它们。

  4. 在Result.java中,我只需要验证一个String变量值。

    我在3天后尝试了很多,有人可以帮我解决这个问题。

1 个答案:

答案 0 :(得分:2)

我们无法告诉您代码的“正确”;因为我们没有完整的图片(你不应该期望有人会花时间潜入你的所有代码,如果你发布它的话)。

所以,对于你的问题:

1)+2)我认为你是落后的。关键是:您告诉EasyMock您的“受测试代码”应该进行的调用。

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

所以,这实际上取决于你的B类的实现。如果实际代码与someMethod()传递的B对象与您在EasyMock分段中提供的B对象相等;比一切都好。但如果他们不平等,那么EasyMock会抱怨。您可以更改它,例如使用匹配器,例如

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

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

但问题在于:如果你使用匹配器;你必须在所有你的论点上使用匹配器。而且(目前);我不知道一个匹配器可以用于“类”论证。所以,现在我只能建议做类似的事情:

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

其中“expectedB”是您事先设置的B对象;以便它与您测试的代码创建的内容相匹配。为了达到目的,你必须确保你的B类是一个“好”的equals()方法。

3)再次;你的“虚拟结果”有能力的问题;取决于您的测试代码将如何使用它。

示例:假设您的测试代码将在该结果对象上调用.toString()。然后你可能想为此做准备;例如,通过制作结果对象...是另一个模拟;期望调用toString()。

长话短说:你使用EasyMock来指定你期望从你的班级中“出来”的所有内容;并控制“流入”被测试类的所有内容。