Mockito는 인수를 고려하지 않고 메서드를 스텁할 수 있습니까?
모키토를 사용해서 레거시 코드를 테스트하려고 합니다.
스텁하고 싶다FooDao
다음과 같이 생산에 사용됩니다.
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);
매처 Import를 잊지 마십시오(다른 많은 매처도 이용 가능).
Mockito 2.1.0 이후의 경우:
import static org.mockito.ArgumentMatchers.*;
이전 버전의 경우:
import static org.mockito.Matchers.*;
http://site.mockito.org/mockito/docs/1.10.19/org/mockito/Matchers.html
anyObject()
니즈에 맞을거야.
또, 항상, 실장하는 것을 고려할 수 있습니다.hashCode()
그리고.equals()
를 위해Bazoo
이렇게 하면 코드 예가 원하는 대로 작동하게 됩니다.
다음과 같이 사용:
when(
fooDao.getBar(
Matchers.<Bazoo>any()
)
).thenReturn(myFoo);
Import하기 전에Mockito.Matchers
또 다른 선택은 좋은 옛 패션에 의존하는 것이다.equals
방법.의 논거가 있는 한when
모의equals
테스트 중인 코드의 인수가 모키토와 일치합니다.
여기 예가 있습니다.
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일 수 있습니다.이 경우 예상되는 인수 개체를 모의 코드에 쉽게 구성할 수 없습니다.
다른 가능한 접근법은 Mockito의Answer
에서 사용할 수 있는 오브젝트when
방법. Answer
그럼 실제 콜을 대행 수신하여 input 인수를 검사하고 모의 객체를 반환할 수 있습니다.아래 예에서는 다음을 사용하고 있습니다.any
조롱받는 방법에 대한 요청을 포착할 수 있습니다.하지만 그 후엔Answer
람다, 바조 논쟁에 대해 더 자세히 알아볼 수 있어제대로 된 신분증이 전달됐는지 확인하려고요나는 이것이 좋다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
인수의 검사를 실시합니다.
언급URL : https://stackoverflow.com/questions/5969630/can-mockito-stub-a-method-without-regard-to-the-argument
'source' 카테고리의 다른 글
구성 요소에 Vuex 맵 상태가 정의되어 있음에도 정의되지 않은 오류가 발생함 (0) | 2022.11.15 |
---|---|
Vuex 스토어 모듈 상태에서 'this'에 액세스하는 방법 (0) | 2022.11.15 |
기본 Java 문자 인코딩 설정 (0) | 2022.11.15 |
CodeIgniter의 ActiveRecord를 사용하여 열 값이 NULL이 아닌 행을 선택하려면 어떻게 해야 합니까? (0) | 2022.11.15 |
Python의 자녀 클래스에서 부모 클래스의 메서드를 호출하려면 어떻게 해야 합니까? (0) | 2022.11.15 |