Intellij中的EasyMock感知调试器?

时间:2012-11-21 10:24:49

标签: debugging junit intellij-idea easymock

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

例如,我有一个传输接口ITransport,它有一些必须被模拟的方法,而且我只想要一些方法返回一些东西。 E.g。

ITransport myTransport = createMock(ITransport.class);

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

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

使用ID 10我想要一次调用方法,

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

expectLastCall.once();

传输类中的某些内容中断并且未调用myTransport,并且我的测试失败。知道我只想用调试器逐步完成代码来检查我的测试失败的原因。所以我添加一个断点来验证模拟的myTransport对象的值。但他们都说“无效”,即使是身份证。所以我假设,通过一些简短的调查,其原因是EasyMock模拟类,它并没有真正用值更新对象(听起来合理),而是在调用方法时在运行时返回模拟值。 / p>

那么,IntelliJ是否有任何模拟识别调试器,让我可以看到该方法最终会返回哪个值。

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

2 个答案:

答案 0 :(得分:1)

这可能不是你想要的......但感觉问题更多的是调试方法。

模拟对象实际上只是 - 模拟 - 这意味着它是一个虚假的空对象,除非你明确告诉它,否则它什么都不做。当您的调试器检查模拟对象时,它将找不到您没有专门编程返回的任何值。这并不意味着保持价值。

EasyMock有一个参数捕获功能,但由于你只是想让它进行调试,这可能是错误的方法。 Mockito有一个间谍功能,可能适合你想要的,但它会涉及额外的模拟编程声明。

我想说最简单的方法是实现你自己的ITransport只是为了在你的测试类中使用。这样,您可以实现getID()始终返回10并在publish()内输入断言语句。您可以实现所需的任何其他方法,以便捕获其他数据以进行调试。并且您可以保留此仅测试ITransport以用于共享使用或将来的调试需求。

答案 1 :(得分:0)

实际上,这些方法是嘲弄的,但是类的内部实现是由它自己决定的。

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

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

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