Mockito를 사용하여 일부 레거시 코드를 테스트하려고합니다.
FooDao
프로덕션에서 사용되는 a 를 다음과 같이 스텁하고 싶습니다 .
foo = fooDao.getBar(new Bazoo());
난 쓸수있다:
when(fooDao.getBar(new Bazoo())).thenReturn(myFoo);
그러나 명백한 문제는 내가 메서드를 스텁 한 getBar()
것과 동일한 Bazoo
객체로 호출되지 않는다는 것입니다. (그 new
연산자를 저주하십시오 !)
myFoo
인수에 관계없이 반환되는 방식으로 메소드를 스텁 할 수 있다면 그것을 좋아할 것 입니다. 실패하면 다른 해결 방법 제안을 듣지 만 합리적인 테스트 적용 범위가 될 때까지 프로덕션 코드를 변경하지 않는 것이 좋습니다.
답변
when(
fooDao.getBar(
any(Bazoo.class)
)
).thenReturn(myFoo);
또는 ( null
s 피하기 위해 ) :
when(
fooDao.getBar(
(Bazoo)notNull()
)
).thenReturn(myFoo);
매처를 가져 오는 것을 잊지 마십시오 (다른 사람도 가능) :
Mockito 2.1.0 이상 :
import static org.mockito.ArgumentMatchers.*;
이전 버전의 경우 :
import static org.mockito.Matchers.*;
답변
다음과 같이 사용하십시오.
when(
fooDao.getBar(
Matchers.<Bazoo>any()
)
).thenReturn(myFoo);
가져 오기 전에 Mockito.Matchers
답변
http://site.mockito.org/mockito/docs/1.10.19/org/mockito/Matchers.html
anyObject()
당신의 요구에 맞아야합니다.
또한, 당신은 항상 구현 고려할 수 hashCode()
및 equals()
을위한 Bazoo
클래스입니다. 그러면 코드 예제가 원하는 방식으로 작동합니다.
답변
또 다른 옵션은 좋은 구식 equals
방법 에 의존하는 것 입니다. 오랫동안의 인수로 when
모의 equals
코드의 인수가 테스트되고, 다음 Mockito는 모의 일치합니다.
다음은 예입니다.
public class MyPojo {
public MyPojo( String someField ) {
this.someField = someField;
}
private String someField;
@Override
public boolean equals( Object o ) {
if ( this == o ) return true;
if ( o == null || getClass() != o.getClass() ) return false;
MyPojo myPojo = ( MyPojo ) o;
return someField.equals( myPojo.someField );
}
}
그런 다음, 가치가 무엇인지 알고 있다고 가정하면 다음 someField
과 같이 조롱 할 수 있습니다.
when(fooDao.getBar(new MyPojo(expectedSomeField))).thenReturn(myFoo);
찬성 : 이것은보다 명확 any
합니다. 코드 검토 자로서 any
, 코드 개발자가 작성하는 코드를 살펴보고 코드의 논리를 살펴보고 전달되는 적절한 객체를 생성합니다.
con : 때때로 객체로 전달되는 필드가 임의의 ID입니다. 이 경우 모의 코드에서 예상 인수 객체를 쉽게 구성 할 수 없습니다.
또 다른 가능한 접근 방법은 메소드 Answer
와 함께 사용할 수있는 Mockito의 객체를 사용하는 when
것입니다. Answer
실제 호출을 가로 채고 입력 인수를 검사하고 모의 객체를 반환 할 수 있습니다. 아래 예제 any
에서 모의중인 메소드에 대한 요청을 잡기 위해 사용 하고 있습니다. 그러나 Answer
람다에서 Bazo 인수를 추가로 검사 할 수 있습니다 … 아마 적절한 ID가 전달되었는지 확인할 수 있습니다. 나는 any
논쟁 자체에 대해 적어도 약간의 조사가 이루어 지도록 이것을 스스로 선호 한다.
Bar mockBar = //generate mock Bar.
when(fooDao.getBar(any(Bazo.class))
.thenAnswer( ( InvocationOnMock invocationOnMock) -> {
Bazo actualBazo = invocationOnMock.getArgument( 0 );
//inspect the actualBazo here and thrw exception if it does not meet your testing requirements.
return mockBar;
} );
그래서 결론을 내릴 때 equals
(예상되는 인수와 실제 인수가 서로 같아야 함) 의존하는 것이 좋으며 (실제 인수의 상태를 예측할 수 없기 때문에) 등호를 사용할 수없는 경우, 나는 의지 할 것입니다 하는 Answer
인수를 검사합니다.