【问题标题】:EasyMock aware debugger in Intellij?Intellij 中的 EasyMock 感知调试器?
【发布时间】:2012-11-24 01:16:59
【问题描述】:

也许这会适得其反,我不知道,但现在我需要一个 IntelliJ 中的调试器,它知道 EasyMock 模拟,尤其是模拟方法实际返回的内容。

例如,我有一个传输接口ITransport,它有一些必须模拟的方法,而我只希望一些方法返回一些东西。例如

ITransport myTransport = createMock(ITransport.class);

我希望 myTransport.getID() 返回一个模拟 ID 10。

expect(myTransport.getID()).andReturn(10);

对于 ID 10,我希望一个方法被调用一次,

expect(myTransport.publish(any(...)));

expectLastCall.once();

传输类中的某些内容中断并且未调用myTransport,并且我的测试失败。知道我只想用调试器单步执行代码来检查我的测试失败的原因。所以我添加了一个断点来验证模拟的myTransport 对象的值。但是他们都说“空”,甚至是ID。所以我假设,经过一些简短的调查,这是因为 EasyMock 模拟类,它并没有真正用值更新对象(这听起来很合理),而是在调用方法时在运行时返回模拟值。

那么,有没有针对 IntelliJ 的模拟感知调试器,可以让我看到该方法最终会返回哪个值。

是的,在我收到回复说“如果您为所有内容编写单元测试就不需要调试器”之前,我只想声明我知道这一点。这是遗留代码,或者至少是没有考虑测试的代码。

【问题讨论】:

  • 启用观察方法返回值选项有帮助吗?

标签: debugging junit intellij-idea easymock


【解决方案1】:

这可能不是你要找的……但感觉问题更多出在调试方法上。

模拟对象实际上就是这样——一个模拟——意味着它是一个假的空对象,除非你明确告诉它,否则它不会做任何事情。当您的调试器检查模拟对象时,它不会找到您没有专门对其进行编程以返回的任何值。它不是用来保存值的。

EasyMock 有一个参数捕获功能,但由于您只是希望它用于调试,因此这可能是错误的方法。 Mockito 有一个间谍功能,可能适合你想要的,但它会涉及额外的模拟编程语句。

我想说最简单的方法是实现您自己的ITransport,仅用于您的测试类。这样您就可以实现getID() 以始终返回10 并在publish() 中放入一个断言语句。并且您可以实现您需要的任何其他方法,以便为调试目的捕获额外的数据。您可以保留这个仅供测试使用的 ITransport 以供共享使用或将来的调试需要。

【讨论】:

  • 是的。那可行。不过,在我的测试代码中可能有点太侵入性了。不太确定我的方法是什么,但现在我在调试器中找到了“评估表达式”按钮,它现在解决了。谢谢!
  • 我不知道这个答案是否回答了 OP 问题,但帮助我弄清楚了为什么我看不到模拟对象的内部值。谢谢。
【解决方案2】:

确实,方法是模拟的,但类的内部实现留给它自己。

通常,您不需要知道返回的内容,因为您是首先记录它的人。

您还可以在调试器中评估 myTransport.getID()。但是这样做会消耗期望值。

但是,能够在模拟中列出所有当前未决的期望似乎是个好主意。也许有一个窥视功能。您可以在 EasyMock 错误跟踪器上请求此类功能:http://jira.codehaus.org/browse/EASYMOCK

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-26
    • 2018-08-13
    • 1970-01-01
    • 2016-10-18
    • 1970-01-01
    • 1970-01-01
    • 2015-04-25
    • 2016-09-12
    相关资源
    最近更新 更多