[英]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.