模拟最后一堂课
前言
如果您已經閱讀了其他有關異常模擬的博客文章,則可以通過此鏈接跳過前奏 。
我被要求匯總一些示例,這些示例如何模擬因其可測試性問題而眾所周知的Java結構:
- 模擬私人方法
- 模擬最終方法
- 模擬最后一堂課
- 模擬構造器
- 模擬靜態方法
我稱這些技術為異常嘲笑。 我擔心這樣的示例在沒有任何指導的情況下會被在模擬框架方面沒有豐富經驗的隊友廣泛使用。
練習TDD或BDD的開發人員應意識到這些構造背后的可測試性問題,并在設計測試和模塊時盡量避免它們。 這就是為什么您可能不會使用這些出色的編程方法在項目上經常遇到如此異常的模擬的原因。
但是有時您必須擴展或維護通常包含低內聚性類的舊代碼庫。 在大多數情況下,當前的忙碌敏捷世界沒有時間使此類易于進行單元測試的標準方法。 當您嘗試對此類進行單元測試時,您通常會意識到需要進行異常模擬。
這就是為什么我決定創建并共享重構注意事項以及異常模擬的示例和變通辦法。 示例包括使用Mockito和PowerMock模擬框架以及TestNG單元測試框架。
模擬最后一堂課
重構注意事項
將類更改為非最終類(刪除final關鍵字)并以標準方式對其進行測試。 這是我可以更改最終課程代碼時始終使用的技術。
PowerMock的用法
在使用此示例之前,請仔細考慮是否值得在您的項目中帶來字節碼操作風險。 他們收集在此博客文章中 。 我認為,僅應在非常罕見且不可避免的情況下使用它。
測試顯示了如何通過PowerMock框架模擬最終類。 示例涵蓋:
期末課程:
public final class Plane {public static final int ENGINE_ID_RIGHT = 2;public static final int ENGINE_ID_LEFT = 1;public boolean verifyAllSystems() {throw new UnsupportedOperationException("Fail if not mocked!");}public void startEngine(int engineId) {throw new UnsupportedOperationException("Fail if not mocked! [engineId=" + engineId + "]");} }被測課程:
public class Pilot {private Plane plane;public Pilot(Plane plane) {this.plane = plane;}public boolean readyForFlight() {plane.startEngine(Plane.ENGINE_ID_LEFT);plane.startEngine(Plane.ENGINE_ID_RIGHT);return plane.verifyAllSystems();} }測試:
@PrepareForTest(Plane.class) public class PilotTest extends PowerMockTestCase {@Testpublic void testReadyForFlight() {Plane planeMock = PowerMockito.mock(Plane.class);Pilot pilot = new Pilot(planeMock);Mockito.when(planeMock.verifyAllSystems()).thenReturn(true);// testing methodboolean actualStatus = pilot.readyForFlight();Assert.assertEquals(actualStatus, true);Mockito.verify(planeMock).startEngine(Plane.ENGINE_ID_LEFT);Mockito.verify(planeMock).startEngine(Plane.ENGINE_ID_RIGHT);} }鏈接
- 可以從Github下載源代碼。
其他不尋常的嘲諷示例:
- 模擬私人方法
- 模擬最終方法
- 模擬構造器
- 模擬靜態方法
翻譯自: https://www.javacodegeeks.com/2014/02/mock-final-class.html
總結
- 上一篇: 现金管理类理财产品的缺点是什么?
- 下一篇: 什么叫进取型理财?