source

Mockito는 인수를 고려하지 않고 메서드를 스텁할 수 있습니까?

manycodes 2022. 11. 15. 21:34
반응형

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);

또는 (회피하기 위해)nulls) :

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

반응형