programing

Mockito.any() Generics와의 인터페이스 패스

javaba 2022. 8. 3. 22:36
반응형

Mockito.any() Generics와의 인터페이스 패스

범용 인터페이스 타입을 통과할 수 있습니까?

인터페이스:

public interface AsyncCallback<T>

내 테스트 방법:

Mockito.any(AsyncCallback.class)

놓는 것<ResponseX>배후 또는 을 위해.class효과가 없었습니다.

타입 세이프 방법이 있다: 사용ArgumentMatchers.any()다음 유형으로 자격을 부여합니다.

ArgumentMatchers.<AsyncCallback<ResponseX>>any()

Java 8을 사용하면 간단하게any()(고도의 스태틱 Import)는 확장된 유형 추론을 위해 인수 또는 유형 매개 변수를 사용하지 않습니다.컴파일러는 타겟타입(method 인수의 타입)에서 실제로 무엇을 의미하는지 알게 되었습니다.Matchers.<AsyncCallback<ResponseX>>any()이는 Java 8 이전 솔루션입니다.

제네릭스를 허용하기 위해 다음과 같은 메카미즘을 채택해야 했습니다.

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

이게 도움이 됐으면 좋겠네요.

pierfevrier 코멘트를 답변으로 투고하는 것은 코멘트가 아닌 답변에 있는 경우에 도움이 될 수 있습니다.

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

게다가 메서드내의 any()에 수식 콜을 발신하는 Soft 의 응답에 가세해, 반환 타입에 의한 추론이 가능하기 때문에, 수식 콜을 삭제할 수 있었습니다.

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

필요에 따라 억제 경고를 추가하여 캐스트할 수 있습니다.

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

Java가 '일반적인' 제네릭을 허용한다면, 이러한 방법을 사용할 수 있을 것입니다.

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

나도 스프링을 사용하는데 비슷한 문제가 있었다.Example:

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

여기서는 자격증을 사용해야 합니다.b/c findAll 메서드는 다음과 같은 여러 유형을 사용할 수 있습니다.Sort그리고.Iterable. 를 사용할 수도 있습니다.Mockito.any(Example.class)물론 안전 경고 유형도 있습니다.

인수 없는 정규 제네릭 유형 사용any()방법은 유효합니다(즉,ArgumentMatchers.<AsyncCallback<ResponseX>>any()). 단, 제네릭 표현이 길어지면 다루기 어려워질 수 있습니다.대안은 반론을 제기하는 것이다.any()는 특정 범용 타입을 반환 타입으로 사용하여 독자적인 범용 메서드를 호출합니다.

private static <T> AsyncCallback<T> anyAsyncCallback() {
  return ArgumentMatchers.any()
}

사용.

Mockito.verify(mockObject).performCallback(any(), anyAsyncCallback())

언급URL : https://stackoverflow.com/questions/7917635/mockito-any-pass-interface-with-generics

반응형