2012-11-02 32 views
0

我正在遇到JUnit/JMock中的某個錯誤。我試圖嘲笑一些對象,然後斷言所有的期望都滿足。我運行一個簡單的測試,如:JUnit - 斷言錯誤不會傳播

@Test 
public void sellingPutOptionProductDoesNotCauseDisclosure() throws PositionVerificationException, DataLoadException, MissingPriceException { 
    final OptionProduct optionProduct = setupOptionProduct(); 
    context.assertIsSatisfied(); 
} 

private OptionProduct setupOptionProduct() { 
    final Option optionProduct = context.mock(Option.class); 
    context.checking(new Expectations() { 
     { 
      oneOf(optionProduct).getUnderlyingProduct(); 
      will(returnValue(new Object())); 
     } 
    }); 
    return optionProduct; 
} 

期權是一個對象,我用嘲笑這樣的:

context = new Mockery() { 
    { 
     setImposteriser(ClassImposteriser.INSTANCE); 
    } 
}; 

如果我運行上面的測試,我gettiing測試通過,其中JVM不會終止,並在控制檯上一個打印出來的是:

異常線程「main」

任何想法可能是造成這個?

+1

自從我使用JMock以來已經有一段時間了,但我沒有看到這個應該失敗的地方。你正在嘲笑,然後驗證,而不與模擬交互。 – cjstehno

+1

Stacktrace?使用你的調試器,看看你是否達到你的測試功能。 –

+0

它擊中它,它得到assertIsSatisfied,這引發assertionError被吞噬 – Bober02

回答

0

我對派對有點遲到,但我只是有一個類似的問題,並能夠追查原因。
正常情況下,當一個方法被調用時,它不是期望的一部分,JMock會建立日誌,告訴你未找到什麼。就我而言,它試圖在遇到意外的呼叫後創建該日誌消息。創建日誌消息的行爲引發了一個異常,這讓JMock感到困惑,它報告說測試通過了,但實際上失敗了。

在我的情況下,拋出異常的原因是傳遞給「unexpected」函數調用的參數之一是類的一個實例。這個班初始化,部分是用嘲弄的對象。當JMock嘗試構建錯誤消息以告訴我有關意外調用時,它需要描述該參數。通常它會說類似於unexpected invocation: myobject.myMethod(param1,param2).

因爲在我的情況下,param1包含模擬對象的成員變量,而param1類未定義toString(),所以使用了默認的Object.toString()。

Object.toString()的定義是:return getClass().getName() + "@" + Integer.toHexString(hashCode());

我實現的哈希碼param1的是用一些人嘲笑的對象。那些調用模擬對象來計算哈希碼的調用本身就是'意想不到的'調用,導致JMock在嘗試向我描述測試失敗時拋出異常。

不幸的是,不是承認這個條件,仍然上報儘可能多的失敗,因爲它可以,JMock的似乎完全放棄和報告測試的傳球和不在意地提起Exception in thread "main."

要看到,如果這是發生在你,我建議你檢查涉及有問題的函數調用的參數。如果它們中的任何一個是類,而不是接口,那麼應該看看它們對equals/hashcode/toString的使用是否使用了對成員變量的任何可疑調用,這些成員變量可能對您的場景被嘲笑的方式表現不佳。