배열을 기대하는 메소드가있는 인터페이스가 있습니다 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
. Hamcrestorg.hamcrest.Matchers
클래스 와의 이름 충돌을 피하기 위해이 클래스는 더 이상 사용되지 않습니다 . 이 클래스는 3.0 버전에서 제거 될 것입니다.
자세한 내용을 읽으려면 mockito 와일드 카드 에 대한 작은 기사를 작성했습니다 .