[英]Creating a mock with Jmock to return a null value for itself
我有一个类似于以下方法:
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做到这一点? 这种模式有意义吗? 这是一个有效的测试吗? 如果没有,有人对如何测试有任何建议吗?
我不认为你只能使用JMock来测试这段代码。
我会通过直接传入null
来测试这个。 如果没有抛出或记录异常,您就知道您的代码按预期工作了。@ Test
public void Test_myMethod_With_Null_MyClass_Does_Not_Call_someMethod()
{
Util.myMethod(null);
//no exception should be thrown.
}
如果你想让它更明确,你可以将myMethod(null)
调用包装在try / catch块中,但这不是必需的,除非在出现故障时澄清失败原因。
public void Test_myMethod_With_Null_MyClass_Does_Not_Call_someMethod()
{
try
{
Util.myMethod(null);
}
catch( ExpectedException e )
{
fail( "Should not have thrown exception: " + e.getMessage() );
}
}
这是一个充分的测试,因为你知道如果c
为null
那么c.something()
当然不能被调用。
模拟应该用于测试对象如何与其协作者交互。 如果没有合作者,那么没有什么可以嘲笑的。 传入null更简单,更具表现力。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.