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


194

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

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

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

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

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

답변:


111

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하며 예외가 발생합니다.


이 답변이 투표권을받을 때마다 기쁘게 생각합니다! any메소드가 작동해야하기 때문에 Java 8 이후로 많은 관심을 끌지 않을 것이라고 추측했을 것 입니다. 당신은 작동하는 것들에 대한 답을 찾지 않습니다!
Lii

나는 내 코드와 함께 일을하지 않았다 내가 왜 몰랐 때문에 여기 온 any()그러나으로 확인 하였다 anyBoolean()답변의 마지막 부분이 아름답게 빛 나고있는.
AdrienW

274

이 작동합니다

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

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

31
단지 스칼라의 경우 다른 사람의 필요를에서 :verify(bar).DoStuff(any[Array[Foo]])
tolitius

6
수입에 문제가 있었고 수입에 hamcrest의 any ()를 사용하고 있었고 mockito의 것과 충돌했습니다.
Doppelganger 2016 년

4
API를 살펴보고 클래스 인수는 캐스팅에 사용되며 메소드는 여전히 모든 종류의 객체를 허용합니다! site.mockito.org/mockito/docs/current/org/mockito/... . 이 경우 site.mockito.org/mockito/docs/current/org/mockito/…에 isA ()를 사용하십시오 .
thilko

1
Hamcrest와의 이름 충돌을 피하기 위해이 클래스는 더 이상 사용되지 않습니다. 사용 org.mockito.ArgumentMatchers
leo9r

12

당신은 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)


이것이 정답입니다. (Clazz)를 사용하는 것은 완전히 잘못되었습니다.
Surasin Tancharoen

3
@SurasinTancharoen 실제로, any (Class)는 isA (Class)의 별칭 일뿐입니다 (문서 참조). 따라서 전혀 잘못이 아닙니다.
jmiserez

8

최신 프로젝트 (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 와일드 카드 에 대한 작은 기사를 작성했습니다 .


Scala에서 org.mockito.ArgumentMatcher를 어떻게 가져올 수 있습니까? 가져 오기 org.mockito.ArgumentMatcher.any를 시도했습니다. org.mockito.ArgumentMatcher
Manu Chadha

버전 3.0에 해당하는 것이 무엇인지 말씀해 주시겠습니까?
Manu Chadha

이 발표 될 예정 일단 우리는 알게 될 것이다)
마치에이 코왈 스키에게
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.