>source

나는 이것에 대해 잠시 동안 머리를 맞대고 검색해 왔으며 여기 누군가가 조롱하는 방법을 알고 있는지 또는 이 code를 조롱하는 것이 가능한지 궁금했습니다.

여기 code가 있습니다. '프로그램'을 조롱하고 지정된 '프로그램' 객체를 반환해야 합니다.

private Program getProgramFromClient(Client client) {
    return programs.stream().filter(
            program -> program.getProgramCode()
                .equalsIgnoreCase(client.getProgramCode()))
        .collect(Collectors.toList()).get(0);
}

현재 다음과 같이 이러한 객체에 @Mock 주석을 사용하고 있습니다.

@Mock
private Program program;
@Mock
private List<Program> programs;

그런 다음 테스트 수업에서 다음과 같은 내용이 있습니다.

@BeforeEach
void setUp() {
   ...
   programs= new ArrayList<>();

그리고 테스트 방법에는 다음이 있습니다.

when(programs.stream().filter(any()).collect(any())).thenReturn(programs);
when(programs.get(any())).thenReturn(program);

테스트를 실행할 때 다음 오류가 발생합니다.

java.lang.NullPointerException

이 줄은 다음과 같습니다.

when(programs.stream().filter(any()).collect(any())).thenReturn(programs);

오류를 클릭하면 커서가 '필터'의 시작 부분으로 이동하여 프로그램이 비어 있다고 말하는 것처럼 보이지만 사실이라고 생각하지만 조롱하려고 합니다. 모의하지 않은 목록으로 만들어야 합니까? 즉, 프로그램이 추가된 실제 목록? 나는 이것을 더 일찍 시도했지만 여전히 문제가 발생했다고 생각하지만 누군가가 다시 제안하면 다시 시도 할 수 있습니다.

다음 내용도 오류 메시지의 일부이지만, 나의 연약하고 불타버린 두뇌는 이것이 현재로서는 정확히 무엇을 의미하는지 이해하는 데 어려움을 겪고 있습니다.

You cannot use argument matchers outside of verification or stubbing.
Examples of correct usage of argument matchers:
    when(mock.get(anyInt())).thenReturn(null);
    doThrow(new RuntimeException()).when(mock).someVoidMethod(anyObject());
    verify(mock).someMethod(contains("foo"))
This message may appear after an NullPointerException if the last matcher is returning an object
like any() but the stubbed method signature expect a primitive argument, in this case,
use primitive alternatives.
    when(mock.get(any())); //bad use, will raise NPE
    when(mock.get(anyInt())); //correct usage use
Also, this error might show up because you use argument matchers with methods that cannot be mocked.
Following methods *cannot* be stubbed/verified: final/private/equals()/hashCode().
Mocking methods declared on non-public parent classes is not supported.

항상 그렇듯이 모든 도움에 감사드립니다!

조롱의 길로 가지 마십시오. 목록은 구성하기 쉽습니다. 몇 가지 알려진 프로그램이 있는 실제 목록으로 방법을 테스트하십시오. 극단적인 경우를 생각해 보십시오. 클라이언트와 일치하는 프로그램이 없으면 어떻게 합니까? 그리고 마지막으로 -구현을 개선하는 방법을 생각하십시오. 첫 번째 요소를 얻기 위해 List에 수집하는 것이 필요한가요? Optional을 반환하도록 API를 변경하시겠습니까?

Lesiak2022-01-15 09:09:16

컬렉션이나 스트림을 조롱하지 마세요. 그럴만한 이유는 절대 없습니다.

Louis Wasserman2022-01-15 09:09:16

Mockito의 문서: 소유하지 않은 유형을 조롱하지 마세요!, 어려운 규칙은 아니지만 세 번째 글머리 기호가 여기에 적용된다고 생각합니다. "복잡할 수 있고 제대로 작동하려면 많은 모의 객체가 필요할 수 있습니다". 이 경우에는 실제 목록, 일반적으로 Arrays.asList(test values)만 사용합니다. Program이 POJO라면 나도 그것을 조롱하지 않을 것입니다 – 같은 문서 페이지에서 값 객체를 조롱하지 마십시오.

Didier L2022-01-14 10:22:53

좋아요, 고마워요!

lukederienzo2022-01-14 20:41:38
  • 이전 kotlin에서 데이터베이스 항목 업데이트
  • 다음 .htaccess : 보고 도구에서 주의를 기울이지 않는 htaccess의 캐시 정책