[java] Mockito의 일반적인“any ()”메소드 사용

배열을 기대하는 메소드가있는 인터페이스가 있습니다 Foo.

public interface IBar {
  void doStuff(Foo[] arr);
}

나는 Mockito를 사용 하여이 인터페이스를 조롱하고 있으며, 그것을 doStuff()호출하고 싶지만 어떤 인수가 전달되는지 확인하고 싶지 않습니다.

any()대신 일반적인 방법 인을 사용하여 다음 코드를 작성하는 방법은 anyObject()무엇입니까?

IBar bar = mock(IBar.class);
...
verify(bar).doStuff((Foo[]) anyObject());



답변

Java 8부터 인수없는 any메소드를 사용할 수 있으며 컴파일러에서 type 인수를 유추합니다.

verify(bar).doStuff(any());

설명

Java 8의 새로운 점 은 표현식 의 대상 유형 이 하위 표현식의 유형 매개 변수를 유추하는 데 사용된다는 것입니다. Java 8 이전에는 유형 매개 변수 유추에 사용 된 메소드에 대해서만 인수가 사용됩니다 (대부분).

이 경우의 매개 변수 유형은 doStuff의 대상 유형이 any()되고의 반환 값 유형은 any()해당 인수 유형과 일치하도록 선택됩니다.

이 메커니즘은 주로 람다 식을 컴파일 할 수 있도록 Java 8에 추가되었지만 일반적으로 형식 유추를 향상시킵니다.


기본 유형

불행히도 기본 유형에는 작동하지 않습니다.

public interface IBar {
    void doPrimitiveStuff(int i);
}

verify(bar).doPrimitiveStuff(any()); // Compiles but throws NullPointerException
verify(bar).doPrimitiveStuff(anyInt()); // This is what you have to do instead

문제는 컴파일러가 Integer의 반환 값으로 유추한다는 것 입니다 any(). Mockito는 (삭제로 인해) 이것을 인식하지 못하고 참조 유형에 대한 기본값 인을 반환합니다 null. 런타임은 intValue에 전달하기 전에 메소드를 호출하여 리턴 값을 개봉하려고 시도 doStuff하며 예외가 발생합니다.


답변

이 작동합니다

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.verify;

verify(bar).DoStuff(any(Foo[].class));


답변

당신은 Mockito.isA()그것을 위해 사용할 수 있습니다 :

import static org.mockito.Matchers.isA;
import static org.mockito.Mockito.verify;

verify(bar).doStuff(isA(Foo[].class));

http://site.mockito.org/mockito/docs/current/org/mockito/Matchers.html#isA(java.lang.Class)


답변

최신 프로젝트 (1.10.19에서 업데이트 된 시점) 에이 기능을 사용해야했기 때문에 사용자 (이미 mockito-core 버전 2.1.0 이상을 사용하는 사용자 )를 최신 상태로 유지하려면 정적 위 답변의 메소드는 ArgumentMatchers클래스 에서 가져와야합니다.

import static org.mockito.ArgumentMatchers.isA;
import static org.mockito.ArgumentMatchers.any;

Mockito 아티팩트를 버전 3부터 가능한 최신 상태로 유지하려는 경우이 클래스가 더 이상 존재하지 않을 수 있습니다.

2.1.0 이상에 따라 org.mockito의 Javadoc.

사용하십시오 org.mockito.ArgumentMatchers. Hamcrest org.hamcrest.Matchers
클래스 와의 이름 충돌을 피하기 위해이 클래스는 더 이상 사용되지 않습니다 . 이 클래스는 3.0 버전에서 제거 될 것입니다.

자세한 내용을 읽으려면 mockito 와일드 카드 에 대한 작은 기사를 작성했습니다 .


답변