IT이야기

stubing에 Argument Captor를 사용하는 방법

cyworld 2022. 6. 29. 21:13
반응형

stubing에 Argument Captor를 사용하는 방법

Mockito 문서javadocs에는 다음과 같이 기술되어 있습니다.

Argument Captor는 stubing이 아닌 검증과 함께 사용하는 것이 좋습니다.

Argument Captor를 스텁에 어떻게 사용할 수 있는지 모르겠습니다.누가 위의 문장을 설명하고 Argument Captor를 stubing에 사용하는 방법을 보여주거나 어떻게 할 수 있는지를 보여주는 링크를 제공할 수 있습니까?

테스트할 수 있는 방법은 다음과 같습니다.

public boolean doSomething(SomeClass arg);

Mockito 문서에서는 captor를 다음과 같이 사용하지 않도록 되어 있습니다.

when(someObject.doSomething(argumentCaptor.capture())).thenReturn(true);
assertThat(argumentCaptor.getValue(), equalTo(expected));

스터브 중에는 매처만 사용할 수 있기 때문입니다.

when(someObject.doSomething(eq(expected))).thenReturn(true);

그러나 검증은 다른 이야기다.테스트에서 이 메서드가 특정 인수를 사용하여 호출되었는지 확인해야 할 경우 다음과 같이 입력합니다.ArgumentCaptor설계 목적은 다음과 같습니다.

ArgumentCaptor<SomeClass> argumentCaptor = ArgumentCaptor.forClass(SomeClass.class);
verify(someObject).doSomething(argumentCaptor.capture());
assertThat(argumentCaptor.getValue(), equalTo(expected));

가정하건대, 검색에서 이 질문에 대한 답을 얻을 수 있다면 다음과 같은 질문을 원할 것입니다.

doReturn(someReturn).when(someObject).doSomething(argThat(argument -> argument.getName().equals("Bob")));

왜냐고요? 저처럼 시간을 소중히 여기시고.equals하나의 테스트 시나리오만을 위해서요.

또한 테스트의 99%가 Mock에서 반환된 null과 분리되므로 합리적인 설계에서는 반환을 피할 수 있습니다.null어떤 대가를 치르더라도Optional아니면 코틀린으로 가든지이는 을 암시한다.verify를 자주 사용할 필요는 없으며 Argument Captors는 쓰기에는 너무 지루합니다.

회선

when(someObject.doSomething(argumentCaptor.capture())).thenReturn(true);

와 같은 일을 할 것이다

when(someObject.doSomething(Matchers.any())).thenReturn(true);

따라서 stubing에 부가가치가 없는 경우 argumentCaptor.capture()를 사용합니다.Matchers.any()를 사용하면 실제로 무슨 일이 일어나는지 알 수 있기 때문에 가독성이 향상됩니다.argumentCaptor.capture()를 사용하면 실제로 일치하는 인수를 읽을 수 없습니다.또, any() 를 사용하는 대신에, 보다 상세한 정보(예상 인수의 클래스)가 있는 경우는, 보다 구체적인 matcher 를 사용해 테스트를 개선할 수 있습니다.

그리고 또 다른 문제:stubbing 시 argumentCaptor.capture()를 사용하면 검증 후 캡처될 것으로 예상되는 값의 수가 불분명해집니다.이 시점에서는 아직 캡처할 값이 없기 때문에 stubbing이 아닌 검증 중에 값을 캡처해야 합니다.그러면 인수 캡터는 스터브 중에 메서드캡처를 캡처하는 것은 무엇일까요?아직 캡처할 것이 없기 때문에 무엇이든 캡처할 수 있습니다.정의되지 않은 동작이라고 생각하고 정의되지 않은 동작을 사용하고 싶지 않습니다.

언급URL : https://stackoverflow.com/questions/12295891/how-to-use-argumentcaptor-for-stubbing

반응형