mockito를 사용하여 개체 속성 값 확인
모키토로 조롱하고 싶은 메서드 콜이 있습니다.먼저 메서드를 호출할 개체의 인스턴스를 만들고 주입했습니다.제 목표는 메서드 호출의 오브젝트 중 하나를 확인하는 것입니다.
mockito를 사용하여 mock 메서드를 호출할 때 오브젝트 및 오브젝트의 속성을 주장 또는 검증할 수 있는 방법이 있습니까?
예
Mockito.verify(mockedObject)
.someMethodOnMockedObject(
Mockito.<SomeObjectAsArgument>anyObject())
★★★★★★★★★★★★★★★★★★★★가 아닌anyObject()
에 특정 되어 있는지 합니다.
Mockito.verify(mockedObject)
.someMethodOnMockedObject(
Mockito.<SomeObjectAsArgument>**compareWithThisObject()**)
Mockito에 새로운 기능이 추가되어 더욱 쉬워졌습니다.
ArgumentCaptor<Person> argument = ArgumentCaptor.forClass(Person.class);
verify(mock).doSomething(argument.capture());
assertEquals("John", argument.getValue().getName());
Mockito 문서 보기
파라미터가 여러 개 있고 단일 파라미터만 캡처하는 경우 기타 ArgumentMatchers를 사용하여 나머지 인수를 랩합니다.
verify(mock).doSomething(eq(someValue), eq(someOtherValue), argument.capture());
assertEquals("John", argument.getValue().getName());
하는 가장 쉬운 은 '인수 오브젝트'를 사용하는 합니다.refEq
★★★★
Mockito.verify(mockedObject).someMethodOnMockedObject(ArgumentMatchers.refEq(objectToCompareWith));
구현되지 않은 할 수 .equals()
되기 때문에, 반성이 사용하다. 경우 합니다.refEq
.
한 가지 더, 만약 당신이 사용하지 않으려면ArgumentCaptor
모키토 햄크레스트 매처스
import org.mockito.Mockito
import org.hamcrest.Matchers
...
Mockito.verify(mockedObject).someMethodOnMockedObject(MockitoHamcrest.argThat(
Matchers.<SomeObjectAsArgument>hasProperty("propertyName", desiredValue)));
이것은 iraSenthil로부터의 회답에 근거하고 있습니다만, 주석(Captor)이 붙어 있습니다.제 생각에는 다음과 같은 이점이 있습니다.
- 더 짧다
- 읽기 쉽다
- 경고 없이 제네릭스를 처리할 수 있다
예:
@RunWith(MockitoJUnitRunner.class)
public class SomeTest{
@Captor
private ArgumentCaptor<List<SomeType>> captor;
//...
@Test
public void shouldTestArgsVals() {
//...
verify(mockedObject).someMethodOnMockedObject(captor.capture());
assertThat(captor.getValue().getXXX(), is("expected"));
}
}
Java 8을 사용하는 경우 Lambda 식을 사용하여 일치시킬 수 있습니다.
import java.util.Optional;
import java.util.function.Predicate;
import org.hamcrest.BaseMatcher;
import org.hamcrest.Description;
public class LambdaMatcher<T> extends BaseMatcher<T>
{
private final Predicate<T> matcher;
private final Optional<String> description;
public LambdaMatcher(Predicate<T> matcher)
{
this(matcher, null);
}
public LambdaMatcher(Predicate<T> matcher, String description)
{
this.matcher = matcher;
this.description = Optional.ofNullable(description);
}
@SuppressWarnings("unchecked")
@Override
public boolean matches(Object argument)
{
return matcher.test((T) argument);
}
@Override
public void describeTo(Description description)
{
this.description.ifPresent(description::appendText);
}
}
콜 예시
@Test
public void canFindEmployee()
{
Employee employee = new Employee("John");
company.addEmployee(employee);
verify(mockedDal).registerEmployee(argThat(new LambdaMatcher<>(e -> e.getName()
.equals(employee.getName()))));
}
상세정보 : http://source.coveo.com/2014/10/01/java8-mockito/
새로운 Matcher 구현 클래스를 만들지 않고 람다 식을 사용하지 않고 단순화된 솔루션:
verify(mockObject).someMockMethod(
argThat((SomeArgument arg) -> arg.fieldToMatch.equals(expectedFieldValue)));
위의 해결방법은 제 경우에는 효과가 없었습니다.메서드가 여러 번 호출되어 Argument Captor를 사용할 수 없었고 각각 검증이 필요했습니다."argThat"을 단 단순한 매처도 쉽게 해냈습니다.
커스텀 매처
// custom matcher
private class PolygonMatcher extends ArgumentMatcher<PolygonOptions> {
private int fillColor;
public PolygonMatcher(int fillColor) {
this.fillColor = fillColor;
}
@Override
public boolean matches(Object argument) {
if (!(argument instanceof PolygonOptions)) return false;
PolygonOptions arg = (PolygonOptions)argument;
return Color.red(arg.getFillColor()) == Color.red(fillColor)
&& Color.green(arg.getFillColor()) == Color.green(fillColor)
&& Color.blue(arg.getFillColor()) == Color.blue(fillColor);
}
}
테스트 러너
// do setup work setup
// 3 light green polygons
int green = getContext().getResources().getColor(R.color.dmb_rx_bucket1);
verify(map, times(3)).addPolygon(argThat(new PolygonMatcher(green)));
// 1 medium yellow polygons
int yellow = getContext().getResources().getColor(R.color.dmb_rx_bucket4);
verify(map, times(1)).addPolygon(argThat(new PolygonMatcher(yellow)));
// 3 red polygons
int orange = getContext().getResources().getColor(R.color.dmb_rx_bucket5);
verify(map, times(3)).addPolygon(argThat(new PolygonMatcher(orange)));
// 2 red polygons
int red = getContext().getResources().getColor(R.color.dmb_rx_bucket7);
verify(map, times(2)).addPolygon(argThat(new PolygonMatcher(red)));
의 매우 입니다.com.nhaarman.mockito_kotlin
verify(mock).execute(argThat {
this.param = expected
})
다음을 참조할 수 있습니다.
Mockito.verify(mockedObject).someMethodOnMockedObject(eq(desiredObject))
그러면 desiredObject를 매개 변수로 사용하여 miscuredObject 메서드가 호출되는지 여부가 확인됩니다.
또 다른 간단한 방법은 다음과 같습니다.
import org.mockito.BDDMockito;
import static org.mockito.Matchers.argThat;
import org.mockito.ArgumentMatcher;
BDDMockito.verify(mockedObject)
.someMethodOnMockedObject(argThat(new ArgumentMatcher<TypeOfMethodArg>() {
@Override
public boolean matches(Object argument) {
final TypeOfMethodArg castedArg = (TypeOfMethodArg) argument;
// Make your verifications and return a boolean to say if it matches or not
boolean isArgMarching = true;
return isArgMarching;
}
}));
refEq의 javadoc은 동등성 검사가 얕다고 언급했습니다!자세한 내용은 다음 링크를 참조하십시오.
.equals() 메서드를 구현하지 않는 다른 클래스를 사용하는 경우 100% "평등 허용" 문제를 제어할 수 없습니다.DefaultMongoTypeMapper 클래스는 .equals() 메서드가 구현되지 않은 예입니다.
org. springframework.콩류.support는 객체의 인스턴스를 생성하는 대신 빈 정의를 생성할 수 있는 메서드를 제공하며 비교 오류를 제거하는 데 사용할 수 있습니다.
genericBeanDefinition(DefaultMongoTypeMapper.class)
.setScope(SCOPE_SINGLETON)
.setAutowireMode(AUTOWIRE_CONSTRUCTOR)
.setLazyInit(false)
.addConstructorArgValue(null)
.getBeanDefinition()
**" 콩의 정의는 콩의 설명일 뿐 콩 자체가 아닙니다.bean 설명은 equals()와 hashCode()를 적절히 구현하기 때문에 새로운 DefaultMongoTypeMapper()를 작성하는 대신 어떻게 작성해야 하는지를 스프링에 알려주는 정의를 제공합니다."
이 예에서는 다음과 같은 작업을 수행할 수 있습니다.
Mockito.verify(mockedObject)
.doSoething(genericBeanDefinition(YourClass.class).setA("a")
.getBeanDefinition());
언급URL : https://stackoverflow.com/questions/1142837/verify-object-attribute-value-with-mockito
'programing' 카테고리의 다른 글
v-on: 키업이 기동하지 않는 기능 (0) | 2022.05.28 |
---|---|
vuex 게시 요청에서 상태의 값을 전달하는 방법 (0) | 2022.05.28 |
라벨 뒤에 초기화되는 변수가 있는 경우 "라벨은 스테이트먼트의 일부만 될 수 있고 선언은 스테이트먼트가 아닙니다"라고 표시되는 이유는 무엇입니까? (0) | 2022.05.28 |
Clion 디버거에서 int 배열의 전체 내용을 표시하려면 어떻게 해야 합니까? (0) | 2022.05.28 |
Apollo Client를 사용하여 상태 업데이트 (0) | 2022.05.28 |