>source

다음 방법에 대한 단위 테스트를 만들려고 합니다.

public CommandDTO update(final MenuRequest request) {
    Menu menu= menuRepository.findByUuid(request.getUuid());
    MenuConverter.convert(request, menu); //map fields
    Menu saved= menuRepository.save(menu);
    return CommandDTO.builder().uuid(saved.getUuid()).build();
}

그리고 캡처하고 싶습니다저장매개변수는 다음 단위 테스트를 사용하여 메서드에서 반환되지 않기 때문에

@RunWith(MockitoJUnitRunner.class)
public class MenuServiceImplTest {
    @InjectMocks
    private MenuServiceImpl menuService;
    @Captor
    private ArgumentCaptor<Menu> menuCaptor;
    //mocks (code omitted for brevity)
    @Test
    public void test_Update() {
        //...
        CommandDTO result= menuService.update(request);
        verify(menuRepository).save(menuCaptor.capture());
        final Menu captured= menuCaptor.getValue();
    }
}

그러나 매개변수는menuRepository.save()저장되지 않은 매개변수이지만 캡처해야 합니다.저장매개변수. 어떻게 해야 하나요? 사용해야합니까@스파이대신에인수캡터?

@JoãoDias 이 문제와 관련하여 답장을 보내주시겠습니까?

Owl2022-01-21 03:18:13

MenuRepository를 조롱하는 경우 save 메서드가 반환해야 하는 항목을 제어할 수 있습니다.

Dhawal Kapil2022-01-21 03:18:13

무슨 뜻인가요? 예제 code를 게시할 수 있습니까? 반면에 내가 그 접근 방식을 따르면 저장된 객체의 값을 줄 것이지만 이 장면에서는 어떻게 테스트할 수 있습니까?

Owl2022-01-21 03:18:13

일반적으로 단위 테스트를 작성할 때 모든 종속성을 모의합니다. 예를 들어 테스트를 작성 중인 MenuServiceImpl의 경우 MenuRepository를 조롱해야 합니다. 그러면 MenuServiceImpl의 기능을 격리하여 테스트할 수 있습니다. 또한 MenuServiceImpl 테스트에서 MenuRepository가 올바르게 작동하는지 테스트할 필요가 없습니다. MenuRepository가 작동하는지 테스트하기 위해 MenuRepository에 대한 다른 테스트를 작성할 수 있기 때문입니다. 레이어를 통해 테스트하고 mock과 실제 클래스 호출의 조합을 사용해야 하는 경우 @Spy 주석을 사용할 수 있습니다.

Dhawal Kapil2022-01-21 03:18:13

나는 이미 메소드를 테스트하는 데 사용한 모든 필요한 리포지토리와 서비스를 조롱합니다. 그러나 나는 당신이 의미하는 바가 약간 혼란 스럽습니다. 질문에서 내 테스트를 수정하여 이 업데이트 방법에 대한 예제 테스트를 간단히 게시할 수 있습니까?

Owl2022-01-21 03:18:13
  • 이전 java : PO 메커니즘에 대한 클래스의 개체 관리
  • 다음 c : 바이너리 파일에서 모든 문자를 읽고 문자열에 저장