Mockito.any () прахадной інтэрфейс з дженеріков

ці можна перадаць тып інтэрфейсу з дженеріков?

інтэрфейс:

public interface AsyncCallback

У маім метадзе выпрабаванняў:

Mockito.any(AsyncCallback.class)

Putting behind or for .class didnt work.

106

6 адказы

Існуе тып-бяспечны спосаб: выкарыстоўваць ArgumentMatchers.any() і кваліфікаваць яго з тыпам:

ArgumentMatchers.>any()

у pierrefevrier згадваецца ў каментарах, з новымі версіямі Mockito гэта

Matchers.>any()
205
дададзена
Гэта на самай справе не больш бяспечнае, так як фактычны метад можа быць выкліканы толькі з правільна набраных аргументам у любым выпадку. Гэта было проста неабходна, каб задаволіць загадзя java8 кампілятар, які не хапала такога роду высновы тыпу.
дададзена аўтар herman, крыніца
Я нешта накшталт гэтага ResponseEntity >> responseEntity = Matchers >>> любой (). І яна заўсёды вяртае нуль
дададзена аўтар Arun, крыніца
Я пацвярджаю, што гэты адказ працуе правільна і душыць папярэджанне.
дададзена аўтар kevinarpe, крыніца
<�Код> Matchers на самой справе не рэкамендуецца, але ArgumentMatchers зрабіў працу.
дададзена аўтар guijob, крыніца
Першы адзін, выкарыстоўваючы ArgumentMatchers працаваў для мяне, і другі адзін з дапамогай Matchers асуджаецца. Я меў некаторую блытаніну пра тое, што гэта ResponseX. аднак атрымаў адказ сам, у маім выпадку я напісаў так :. ArgumentMatchers <�Спецыфікацыя <�Выклік >> любога ()
дададзена аўтар Barani r, крыніца
З з'яўленнем новых версій Mockito: (Matchers > любога() .
дададзена аўтар pierrefevrier, крыніца

Using Java 8, you can simply use any() (assuming static import) without argument or type parameter because of enhanced type inference. The compiler now knows from the target type (the type of the method argument) that you actually mean Matchers.>any(), which is the pre-Java 8 solution.

47
дададзена
@MatthewRead Выкарыстанне AsyncCallback не павінен нават кампіляваць, калі тып аргументу 'AsyncCallback '.
дададзена аўтар herman, крыніца
@MatthewRead Дзякуючы сціранню, фактычны тып не можа быць праверана падчас выканання Mockito. Такім чынам, вы не можаце нават выкарыстоўваць Isa() . Калі аб'ект мае Клас аб'ект, які адпавядае тыпу, а інтэрфейс выстаўляе гэта, я думаю, вы маглі б праверыць яго ў карыстацкай ўзгадненне. Ці, напрыклад, у выпадку Collection вы можаце праверыць тып элементаў.
дададзена аўтар herman, крыніца
<�Код> Matchers быў заменены ArgumentMatchers у Mockito v2
дададзена аўтар bheussler, крыніца
Не быў бы любой() матч AsyncCallback а?
дададзена аўтар Matthew Read, крыніца
Я задаюся пытаннем аб сітуацыі, калі аргумент тыпу з'яўляецца радавым, а таксама, але вы толькі хочаце, каб дражніць яго для аднаго канкрэтнага тыпу (або высмейваць яго для некалькіх тыпаў па-рознаму). Улічваючы пры (х (любой ())). ThenAnswer (...) , напрыклад, дзе у гэта публічны T у (AsyncCallback АГ) . Магчыма, было б лепш, каб праверыць тып у адказ, калі гэта тое, што трэба?
дададзена аўтар Matthew Read, крыніца
Ах, вы маеце рацыю. Я быў на самай справе проста больш чытаць па тыпу сціраннем і па нейкай прычыне не падключаць яго да гэтага. Дзякуй за тлумачэнне!
дададзена аўтар Matthew Read, крыніца

Я павінен быў прыняць наступны mechamism для забеспячэння дженеріков:

import static org.mockito.Matchers.any;
List list = any();
when(callMyMethod.getResult(list)).thenReturn(myResultString);

Спадзяюся, што гэта дапаможа камусьці.

11
дададзена
Глядзіце мой адказ: гэта ўжо не трэба з Java 8.
дададзена аўтар herman, крыніца

Праводка pierrefevrier каментар як адказ, які можа быць карысным, калі ён прадставіць у адказ замест каментароў.

With new versions of Mockito: (Matchers.>any()

3
дададзена
я дадаў свой каментар да першапачатковага адказу
дададзена аўтар Joerg, крыніца

Вы можаце проста кінуць яго, дадаючы Падавіць папярэджання, калі вы хочаце:

@SuppressWarnings("unchecked")    
AsyncCallback callback = Mockito.any(AsyncCallback.class)

Калі Java дазволена «агульныя» джынэрыкі яны маглі б мець метад, як гэта што тое, што вы шукаеце

private static  T mock(Class> clazz)
1
дададзена
Не вельмі добрая ідэя, каб выкарыстоўваць @SuppressWarnings : папярэдне Java 8, калі вы збіраецеся прызначыць яго ў асобную зменную, вы можаце проста выкарыстоўваць любой() як у theINtoy-х адказаць. Зараз з Java 8, любой() можна выкарыстоўваць ўбудаваны без неабходнасці асобнага задання.
дададзена аўтар herman, крыніца
Калі я паспрабаваў гэта, я атрымаў паведамленне пра памылку ў маім цесцю :. <�Код> Вы не можаце выкарыстоўваць аргумент matchers па-за праверкі або гасячы
дададзена аўтар kevinarpe, крыніца
@kevinarpe, калі ў вас ёсць некалькі matchers аргументаў яны павінны выклікацца ў парадку, як мова Java вызначае.
дададзена аўтар TWiStErRob, крыніца

Акрамя таго, каб адказаць thSoft кладзе кваліфікаваны выклік любога() у метадзе азначалі, што я мог бы выдаліць кваліфікацыю, так як тып якое вяртаецца дазволены выснова:

private HashMap anyStringStringHashMap() {
    return Matchers.any();
}
0
дададзена