Mockito.any ()는 제네릭과 인터페이스를 전달합니다.


170

제네릭으로 인터페이스 유형을 전달할 수 있습니까?

인터페이스 :

public interface AsyncCallback<T>

내 테스트 방법에서 :

Mockito.any(AsyncCallback.class)

미루 <ResponseX>거나하지 .class않았다.

답변:


306

형식에 안전한 방법이 있습니다. 다음 ArgumentMatchers.any()과 같이 형식을 사용 하고 정규화하십시오.

ArgumentMatchers.<AsyncCallback<ResponseX>>any()

4
이 답변이 작동 함을 확인하고 경고를 올바르게 표시하지 않습니다.
kevinarpe

1
실제 메소드는 올바른 유형의 인수로만 호출 할 수 있기 때문에 이것은 실제로 안전하지 않습니다. 이러한 유형의 유추가 없었던 pre-java8 컴파일러를 만족시켜야했습니다.
herman December

이 ResponseEntity <List <Map <String, Object >>> responseEntity = Matchers. <ResponseEntity <List <Map <String, Object >>>>와 같은 것을 사용했습니다. any (); 그리고 항상 null을 반환합니다.
Arun

6
: Mockito의 새 버전(Matchers.<AsyncCallback<ResponseX>>any()
pierrefevrier

15
Matchers실제로는 더 이상 사용되지 않지만 ArgumentMatchers작동했습니다.
guijob

67

Java 8을 사용 any()하면 향상된 유형 유추로 인해 인수 또는 유형 매개 변수없이 간단하게 정적 가져 오기 를 사용할 수 있습니다 . 컴파일러는 이제 대상 유형 (메소드 인수의 유형)에서 실제로 의미하는 것을 알았습니다 Matchers.<AsyncCallback<ResponseX>>any(). 이것은 Java 8 이전의 솔루션입니다.


any()일치 하지 AsyncCallback<AnyOtherType>않습니까?
Matthew 읽기

@MatthewRead AsyncCallback<AnyOtherType>인수 유형이 'AsyncCallback <ResponseX>'인 경우 Using 를 컴파일하지 않아야합니다.
herman

1
인수 유형이 일반적인 상황에 대해 궁금하지만 하나의 구체적인 유형에 대해서만 조롱하거나 다른 유형의 여러 유형에 대해 조롱하려고합니다. 을 감안할 때 when(x.y(any())).thenAnswer(...), 예를 들면 곳이 y있다 public <T> T y(AsyncCallback<T> arg). 아마도 필요한 경우 대답의 유형을 확인하는 것이 좋습니다.
Matthew 읽기

2
@MatthewRead 삭제로 인해 Mockito가 런타임에 실제 유형을 확인할 수 없습니다. 그래서 당신은 사용할 수 없습니다 isA(). 객체가 Class유형에 해당하는 객체를 보유하고 인터페이스가 이것을 노출하면 사용자 정의 매처에서 확인할 수 있습니다. 또는 예를 들어 Collection요소의 유형을 확인할 수 있습니다.
herman

1
Matchers대체되었다 ArgumentMatchersMockito v2의에
bheussler

15

제네릭을 허용하려면 다음과 같은 메커니즘을 채택해야했습니다.

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

이것이 누군가를 돕기를 바랍니다.


3
내 대답을 참조하십시오 : 이것은 Java 8에서는 더 이상 필요하지 않습니다.
herman December

5

pierrefevrier 의견을 답변으로 게시하면 댓글 대신 답변에있는 경우 유용 할 수 있습니다.

Mockito의 새로운 버전 : (Matchers.<AsyncCallback<ResponseX>>any()


1
나는 원래 답변에 자신의 의견을 추가
Joergi

2

thSoft의 답변에 덧붙여 메소드에서 any ()에 대한 한정된 호출을하는 것은 반환 유형이 유추를 허용했기 때문에 자격을 제거 할 수 있음을 의미했습니다.

private HashMap<String, String> anyStringStringHashMap() {
    return Matchers.any();
}

0

원하는 경우 억제 경고를 추가하여 캐스트 할 수 있습니다.

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

Java가 'generic'제네릭을 허용하면 다음과 같은 방법을 사용할 수 있습니다.

private static <T, E> T<E> mock(Class<T<E>> clazz)

이 작업을 시도했을 때 테스트에서 오류가 발생했습니다.You cannot use argument matchers outside of verification or stubbing.
kevinarpe

사용하지 않는 것이 좋습니다 @SuppressWarnings: pre-java 8, 별도의 변수에 할당하려는 경우 any()INtoy의 답변과 같이 사용할 수 있습니다 . 이제 Java 8에서는 any()별도의 할당없이 인라인으로 사용할 수 있습니다.
herman

@kevinarpe 여러 개의 인수 매 처가있는 경우 Java 언어에서 지정한대로 순서대로 호출해야합니다.
TWiStErRob

0

Spring을 사용하여 비슷한 문제가 발생했습니다 Example.

Mockito.when(repo.findAll(Mockito.<Example<SrvReqToSupplierComment>>any()))
            .thenReturn(Lists.emptyList());

여기서, b / c findAll 메소드는 규정을 사용해야 Sort하고 and와 같은 여러 유형을 사용할 수 있습니다 Iterable. Mockito.any(Example.class)유형 안전 경고와 함께 사용할 수도 있습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.