我有一个类似于以下的方法:
public void myMethod(MyClass c)
{
if (c == null)
{
return;
}
try
{
c.someMethod();
}
catch (SomeException e)
{
// log the exception, possibly re-throw
}
}
我试图找到一种方法来设置 MyClass 参数 c 的模拟实例,以便它为自己返回 null 值,并且永远不会调用 c.someMethod() 。我的单元测试如下所示:
@Test
public void Test_myMethod_With_Null_MyClass_Does_Not_Call_someMethod()
{
Mockery mockery = new Mockery()
{{
setImposteriser(ClassImposteriser.INSTANCE);
}};
final MyClass mockMyClass = mockery.mock(MyClass.class);
try
{
mockery.checking(new Expectations()
{{
oneOf(mockMyClass).equals(null);
will(returnValue(true));
never(mockMyClass).someMethod();
}});
}
catch (Exception e)
{
logger.fatal(e);
fail("Exception thrown in test.");
}
Util.myMethod(mockMyClass);
}
基本上,我正在设置 MyClass 的模拟实例,并对其设置期望,即当针对空值测试其值时,它将返回 true,并且永远不会调用方法 someMethod()。
现在,测试失败了,因为 jMock 说不可能覆盖 Object 类提供的方法(equals(null) 部分)。
有没有办法用 jMock 做到这一点?这种模式有意义吗?这是一个有效的测试吗?如果没有,是否有人对如何测试有任何建议?