久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

<i id='LqqHU'><tr id='LqqHU'><dt id='LqqHU'><q id='LqqHU'><span id='LqqHU'><b id='LqqHU'><form id='LqqHU'><ins id='LqqHU'></ins><ul id='LqqHU'></ul><sub id='LqqHU'></sub></form><legend id='LqqHU'></legend><bdo id='LqqHU'><pre id='LqqHU'><center id='LqqHU'></center></pre></bdo></b><th id='LqqHU'></th></span></q></dt></tr></i><div class="qwawimqqmiuu" id='LqqHU'><tfoot id='LqqHU'></tfoot><dl id='LqqHU'><fieldset id='LqqHU'></fieldset></dl></div>
      <tfoot id='LqqHU'></tfoot>

        • <bdo id='LqqHU'></bdo><ul id='LqqHU'></ul>
        <legend id='LqqHU'><style id='LqqHU'><dir id='LqqHU'><q id='LqqHU'></q></dir></style></legend>

        <small id='LqqHU'></small><noframes id='LqqHU'>

        使用 mockito 模擬使用通配符返回泛型的方法

        mocking a method that return generics with wildcard using mockito(使用 mockito 模擬使用通配符返回泛型的方法)

        <small id='BVfxb'></small><noframes id='BVfxb'>

        <tfoot id='BVfxb'></tfoot>

      1. <i id='BVfxb'><tr id='BVfxb'><dt id='BVfxb'><q id='BVfxb'><span id='BVfxb'><b id='BVfxb'><form id='BVfxb'><ins id='BVfxb'></ins><ul id='BVfxb'></ul><sub id='BVfxb'></sub></form><legend id='BVfxb'></legend><bdo id='BVfxb'><pre id='BVfxb'><center id='BVfxb'></center></pre></bdo></b><th id='BVfxb'></th></span></q></dt></tr></i><div class="qwawimqqmiuu" id='BVfxb'><tfoot id='BVfxb'></tfoot><dl id='BVfxb'><fieldset id='BVfxb'></fieldset></dl></div>

              <bdo id='BVfxb'></bdo><ul id='BVfxb'></ul>

              <legend id='BVfxb'><style id='BVfxb'><dir id='BVfxb'><q id='BVfxb'></q></dir></style></legend>

                    <tbody id='BVfxb'></tbody>
                  本文介紹了使用 mockito 模擬使用通配符返回泛型的方法的處理方法,對(duì)大家解決問題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧!

                  問題描述

                  我使用的是 mockito 1.9.5.我有以下代碼:

                  公共類 ClassA {公共列表getMyInterfaces() {返回空值;}公共靜態(tài)無效testMock(){列出<我的界面>接口 = 新的 ArrayList<>();ClassA classAMock = mock(ClassA.class);when(classAMock.getMyInterfaces()).thenReturn(interfaces);}

                  我得到一個(gè)編譯錯(cuò)誤 thenReturn(interfaces) 說:

                  "類型中的thenReturn(List)方法OngoingStubbing<List<capture#1-of ?擴(kuò)展我的接口>>不適用于論點(diǎn)(列表<MyInterface>)"

                  但是,當(dāng)我使用 mockito 的 thenAnswer 方法時(shí),我沒有收到錯(cuò)誤消息.誰能告訴我發(fā)生了什么事?為什么我在使用 thenReturn 方法時(shí)會(huì)收到錯(cuò)誤消息?當(dāng) ClassA 由第三方提供且無法修改時(shí),是否有其他方法可以解決此問題?

                  解決方案

                  編輯:從 Mockito 1.10.x 開始,嵌入在類中的泛型類型現(xiàn)在被 Mockito 用于深度存根.IE.

                  公共接口 A<T 擴(kuò)展 Observer &可比

                  Mockito 盡力獲取編譯器嵌入的類型信息,但是當(dāng)應(yīng)用擦除時(shí),mockito 只能返回 Object 的模擬.

                  <小時(shí)>

                  原創(chuàng):嗯,這更多是泛型的問題,而不是 Mockito 的問題.對(duì)于泛型,您應(yīng)該閱讀 Angelika Langer 在它們上寫的內(nèi)容.對(duì)于當(dāng)前主題,即通配符,請(qǐng)閱讀此部分.p>

                  但簡而言之,您可以使用 Mockito 的其他語法來幫助您解決當(dāng)前的情況:

                  doReturn(interfaces).when(classAMock).getMyInterfaces();

                  或者使用 BDD 別名:

                  willReturn(interfaces).given(classAMock).getMyInterfaces();

                  盡管如此,您可以編寫更通用友好的包裝器.這將有助于未來的開發(fā)人員使用相同的第 3 方 API.

                  <小時(shí)>

                  附帶說明:您不應(yīng)該模擬您不擁有的類型,這可能會(huì)導(dǎo)致許多錯(cuò)誤和問題.相反,你應(yīng)該有一些包裝.例如 DAO 和存儲(chǔ)庫就代表了這樣的想法,人們將模擬 DAO 或存儲(chǔ)庫接口,而不是 JDBC/JPA/hibernate 的東西.有很多關(guān)于此的博客文章:

                  • http://davesquared.net/2011/04/dont-mock-types-you-dont-own.html
                  • http://blog.8thlight.com/eric-smith/2011/10/27/thats-not-yours.html
                  • https://web.archive.org/web/20140923101818/http://freshbrewedcode.com/derekgreer/2012/04/01/tdd-best-practices-dont-mock-others/
                  • ...

                  I'm using mockito 1.9.5. I have the following code:

                  public class ClassA  {
                  
                  public List<? extends MyInterface> getMyInterfaces() {
                      return null;
                  }
                  
                  public static void testMock() {
                      List<MyInterface> interfaces = new ArrayList<>();
                      ClassA classAMock = mock(ClassA.class);
                      when(classAMock.getMyInterfaces()).thenReturn(interfaces);      
                  }
                  

                  I get a compilation error for the thenReturn(interfaces) saying:

                  "The method thenReturn(List<capture#1-of ? extends MyInterface>) in the type 
                   OngoingStubbing<List<capture#1-of ? extends MyInterface>> is not applicable for the arguments 
                   (List<MyInterface>)"
                  

                  However, when I use the thenAnswer method of mockito, I don't get the error. Can anyone tell me what's going on? Why do I get the error when I use the thenReturn method? Is there any other way to solve this problem when ClassA is provided by a 3rd party and cannot be modified?

                  解決方案

                  EDIT : Starting from Mockito 1.10.x, generics types that are embedded in the class are now used by Mockito for deep stubs. ie.

                  public interface A<T extends Observer & Comparable<? super T>>  {
                    List<? extends B> bList();
                    T observer();
                  }
                  
                  B b = deep_stubbed.bList().iterator().next(); // returns a mock of B ; mockito remebers that A returns a List of B
                  Observer o = deep_stubbed.observer(); // mockito can find that T super type is Observer
                  Comparable<? super T> c = deep_stubbed.observer(); // or that T implements Comparable
                  

                  Mockito tries its best to get type information that the compiler embeds, but when erasure applies, mockito cannot do anything but return a mock of Object.


                  Original : Well that's more of an issue with generics than with Mockito. For generics, you should read what Angelika Langer wrote on them. And for the current topic, i.e. wildcards, read this section.

                  But for short, what you could use is the other syntax of Mockito to help with your current situation :

                  doReturn(interfaces).when(classAMock).getMyInterfaces();
                  

                  Or with the BDD aliases :

                  willReturn(interfaces).given(classAMock).getMyInterfaces();
                  

                  Nevertheless, you could write wrappers that are more generic friendly. That will help future developers working with same 3rd party API.


                  As a side note: you shouldn't mocks type you don't own, it can lead to many errors and issues. Instead you should have some wrapper. DAO and repositories for example represent such idea, one will mock the DAO or repository interface, but not the JDBC / JPA / hibernate stuff. There are many blog posts about that:

                  • http://davesquared.net/2011/04/dont-mock-types-you-dont-own.html
                  • http://blog.8thlight.com/eric-smith/2011/10/27/thats-not-yours.html
                  • https://web.archive.org/web/20140923101818/http://freshbrewedcode.com/derekgreer/2012/04/01/tdd-best-practices-dont-mock-others/
                  • ...

                  這篇關(guān)于使用 mockito 模擬使用通配符返回泛型的方法的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,也希望大家多多支持html5模板網(wǎng)!

                  【網(wǎng)站聲明】本站部分內(nèi)容來源于互聯(lián)網(wǎng),旨在幫助大家更快的解決問題,如果有圖片或者內(nèi)容侵犯了您的權(quán)益,請(qǐng)聯(lián)系我們刪除處理,感謝您的支持!

                  相關(guān)文檔推薦

                  How can I detect integer overflow on 32 bits int?(如何檢測(cè) 32 位 int 上的整數(shù)溢出?)
                  Local variables before return statements, does it matter?(return 語句之前的局部變量,這有關(guān)系嗎?)
                  How to convert Integer to int?(如何將整數(shù)轉(zhuǎn)換為整數(shù)?)
                  How do I create an int array with randomly shuffled numbers in a given range(如何在給定范圍內(nèi)創(chuàng)建一個(gè)隨機(jī)打亂數(shù)字的 int 數(shù)組)
                  Inconsistent behavior on java#39;s ==(java的行為不一致==)
                  Why is Java able to store 0xff000000 as an int?(為什么 Java 能夠?qū)?0xff000000 存儲(chǔ)為 int?)

                  • <bdo id='LGZ5b'></bdo><ul id='LGZ5b'></ul>

                      <i id='LGZ5b'><tr id='LGZ5b'><dt id='LGZ5b'><q id='LGZ5b'><span id='LGZ5b'><b id='LGZ5b'><form id='LGZ5b'><ins id='LGZ5b'></ins><ul id='LGZ5b'></ul><sub id='LGZ5b'></sub></form><legend id='LGZ5b'></legend><bdo id='LGZ5b'><pre id='LGZ5b'><center id='LGZ5b'></center></pre></bdo></b><th id='LGZ5b'></th></span></q></dt></tr></i><div class="qwawimqqmiuu" id='LGZ5b'><tfoot id='LGZ5b'></tfoot><dl id='LGZ5b'><fieldset id='LGZ5b'></fieldset></dl></div>

                          <small id='LGZ5b'></small><noframes id='LGZ5b'>

                        1. <legend id='LGZ5b'><style id='LGZ5b'><dir id='LGZ5b'><q id='LGZ5b'></q></dir></style></legend>
                          <tfoot id='LGZ5b'></tfoot>
                            <tbody id='LGZ5b'></tbody>
                            主站蜘蛛池模板: 日韩一区二区在线视频 | 九色网址| 在线欧美视频 | 麻豆久久久9性大片 | 日韩高清一区 | 亚洲精品字幕 | 精品久久久久久亚洲精品 | 四虎在线观看 | 午夜爽爽爽男女免费观看 | 在线亚洲精品 | 免费视频一区二区 | 日本一区二区高清不卡 | 午夜免费av | 老司机深夜福利网站 | 九色av | 久草在线在线精品观看 | 中文二区 | av中文字幕在线 | 亚洲精品久久久久中文字幕二区 | 日日干夜夜操 | 国产成人久久精品 | 亚洲一区 中文字幕 | 久久亚洲一区 | 欧美成视频在线观看 | 久久亚洲国产精品日日av夜夜 | 黄色一级免费 | 一级高清免费毛片 | 久久国产精品免费一区二区三区 | 欧美一区二区三区久久精品视 | 欧美视频免费在线观看 | 一区二区三区在线免费观看 | 97国产在线观看 | 高清18麻豆 | 午夜国产| 亚洲欧美在线视频 | 丝袜久久| 98久久| 久久精品国产一区二区 | 精品无码三级在线观看视频 | 在线成人免费视频 | 九色 在线 |