0

也许这会适得其反,我不知道,但现在我需要一个 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 的模拟感知调试器让我看到该方法最终将返回哪个值。

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

4

2 回答 2

1

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

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

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

我想说最简单的方法是实现你自己的ITransport,只是为了在你的测试类中使用。这样你就可以实现getID()总是返回10并在你的publish(). 并且您可以实现您需要的任何其他方法,以便为调试目的捕获额外的数据。而且您可以保留此测试仅ITransport用于共享使用或将来的调试需求。

于 2012-11-22T10:04:54.557 回答
0

事实上,这些方法是模拟的,但类的内部实现留给它自己。

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

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

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

于 2012-11-23T17:16:59.863 回答