programing

mockito를 사용하여 개체 속성 값 확인

prostudy 2022. 5. 28. 09:05
반응형

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은 동등성 검사가 얕다고 언급했습니다!자세한 내용은 다음 링크를 참조하십시오.

https://static.javadoc.io/org.mockito/mockito-core/2.2.29/org/mockito/ArgumentMatchers.html#refEq(T,%20java.lang.String...)

.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

반응형