【问题标题】:EasyMock - Mock a class having other class object and .class as parametersEasyMock - 模拟具有其他类对象和 .class 作为参数的类
【发布时间】:2016-04-13 12:30:34
【问题描述】:

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

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

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

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

3天以来我一直在尝试,有人可以帮我解决这个问题吗?

【问题讨论】:

    标签: java mocking easymock


    【解决方案1】:

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

    所以,对于您的问题:

    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 中的静态方法)。

    但问题是:如果你使用匹配器;您必须在 all 您的论点上使用匹配器。并且(暂时);我不知道适用于“类”参数的匹配器。所以,现在我只能建议这样做:

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

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

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

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

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

    【讨论】:

    • 感谢您的回复朋友..我已尝试按照您的建议进行更改..在更改第三个参数 notNull(C.class) 时显示...类型不匹配:无法从 C 转换到 Class 错误。
    • 是的,你是对的; notNull(Class) 将返回一个 T ... 不是 T.class。我会更新我的答案。至少现在:我也迷路了。不确定是否/如何匹配某个类。
    • 其实我已经准备好了expectB对象,我有一个叫reqId的字段,这个字段会为每个新请求随机生成。但是在我创建的 expectedB 对象中,我给出了自己的一些值,因为 reqId 将随机生成,我无法将 expectedB 与原始对象匹配(将在运行应用程序时生成)。
    • 因此它给出了意外的方法调用异常。
    • 我尝试用我在模拟对象中使用的值对原始值进行硬编码,但仍然出现意外的方法调用异常
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多