日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用PowerMock模拟构造函数

發(fā)布時間:2023/12/3 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用PowerMock模拟构造函数 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
我認為,依賴項注入的主要好處之一是可以將模擬和/或存根對象注入代碼中,以提高可測試性,增加測試覆蓋率并編寫更好,更有意義的測試。 但是,有時候您會遇到一些不使用依賴注入的傳統(tǒng)代碼,而是通過組合而不是聚合將它們結(jié)合在一起。

發(fā)生這種情況時,您有三種選擇:

  • 忽略該問題,不編寫任何測試。
  • 瘋狂地進行重構(gòu),更改所有內(nèi)容以使用依賴項注入。
  • 使用PowerMock模擬構(gòu)造函數(shù)
  • 顯然,選項1并不是一個嚴肅的選項,盡管我建議重構(gòu)以將所有內(nèi)容移至依賴項注入,但這需要時間,而且您必須務(wù)實。 這就是PowerMock的用處。此博客演示了如何使用PowerMock模擬構(gòu)造函數(shù),這意味著當您的代碼調(diào)用new時,它不會創(chuàng)建真實的對象,而是會創(chuàng)建模擬對象。

    為了證明這個想法,我們首先需要測試一些類,如下所示。

    public class AnyOldClass {public String someMethod() {return "someMethod";}}public class UsesNewToInstantiateClass {public String createThing() {AnyOldClass myclass = new AnyOldClass();String returnValue = myclass.someMethod();return returnValue;}}

    第一個類AnyOldClass是代碼通過調(diào)用new實例化的類。 在這個例子中,顧名思義,它可以是任何東西。

    第二個類,恰當?shù)孛麨閁sesNewToInstantiateClass,具有一個方法createThing(),該方法在調(diào)用時會執(zhí)行以下操作:

    AnyOldClass myclass = new AnyOldClass();

    這一切都非常簡單,因此我們將快速進行PowerMock輔助的JUnit測試:

    import static org.easymock.EasyMock.expect; import static org.junit.Assert.assertEquals; import static org.powermock.api.easymock.PowerMock.expectNew; import static org.powermock.api.easymock.PowerMock.replay; import static org.powermock.api.easymock.PowerMock.verify;import org.junit.Test; import org.junit.runner.RunWith; import org.powermock.api.easymock.annotation.Mock; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner;@RunWith(PowerMockRunner.class) @PrepareForTest(UsesNewToInstantiateClass.class) public class MockConstructorTest {@Mockprivate AnyOldClass anyClass;private UsesNewToInstantiateClass instance;@Testpublic final void testMockConstructor() throws Exception {instance = new UsesNewToInstantiateClass();expectNew(AnyOldClass.class).andReturn(anyClass);final String expected = "MY_OTHER_RESULT";expect(anyClass.someMethod()).andReturn(expected);replay(AnyOldClass.class, anyClass);String result = instance.createThing();verify(AnyOldClass.class, anyClass);assertEquals(expected, result);}}

    首先,該類具有通常的PowerMock附加功能:

    @RunWith(PowerMockRunner.class) @PrepareForTest(UsesNewToInstantiateClass.class)

    在文件的頂部加上anyOldClass模擬對象的創(chuàng)建。 要考慮的重要代碼行是:

    expectNew(AnyOldClass.class).andReturn(anyClass);

    這行代碼告訴PowerMock期望調(diào)用新的AnyOldClass()并返回我們的anyClass模擬對象。

    同樣有趣的是重播和驗證的調(diào)用。 在上面的示例中,它們都有兩個參數(shù)。 第一個,AnyOldClass.class與上面的ExpectNew(…)調(diào)用有關(guān),而第二個,anyClass則與簡單的模擬調(diào)用Expect(anyClass.someMethod())。Return(expected);相關(guān)。

    在某些時候,您確實應(yīng)該讓new來做它所做的事情:創(chuàng)建一個請求類型的新對象。 有一種觀點認為,在測試時您可能過度隔離代碼,而對所有內(nèi)容進行模擬會降低測試的含義和價值。 對我來說,沒有正確的答案,這是一個選擇的問題。

    很明顯,如果您的代碼訪問諸如數(shù)據(jù)庫之類的外部資源,那么您將重構(gòu)并實現(xiàn)DI或使用PowerMock。 如果您的被測試代碼不訪問任何外部資源,那么更多的是判斷多少代碼隔離過多? 這也許需要一些思考,并且可能是另一天另一個博客的主題……

    參考: 使用PowerMock從我們的JCG合作伙伴 Roger Hughes 嘲笑 “ Captain Debug's”博客中的 構(gòu)造方法 。


    翻譯自: https://www.javacodegeeks.com/2012/09/using-powermock-to-mock-constructors.html

    總結(jié)

    以上是生活随笔為你收集整理的使用PowerMock模拟构造函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。