2017-11-17 14 views
1

일부 JSON 데이터를 검색하도록 원격 REST 서버에 요청하는 Java 메소드를 테스트하고 해당 JSON에서 ID를 추출한 다음 ID를 사용하여 다른 엔드 포인트의 동일한 서버에 다른 요청을 작성하려고합니다.Java의 동일한 테스트에서 여러 엔드 포인트와 함께 REST 서버를 조롱하는 방법은 무엇입니까?

Mockito의 MockRestServiceServer를 사용하여 하나의 엔드 포인트에 대한 단일 요청을 기대하는 서버를 모의 테스트하고 테스트 할 수는 있지만 미리 정의 된 엔드 포인트 세트가있는 서버를 자체 기대치 및 응답과 함께 만들 수는 없습니다.

원격 서버에 대해 여러 개의 다른 요청을하는 단일 기능을 테스트하기 위해 서버를 여러 끝점으로 조롱하려면 어떻게해야합니까?

+0

질문을 일관되게 작성했다고 생각하지만 여러 요청을 할 수없는 이유를 이해하는 데 어려움을 겪고 있습니다. 첫 번째 끝점에 요청을 보내고 JSON 응답을 구문 분석 한 다음 이전에 구문 분석 된 JSON을 사용하여 다른 끝점 중 하나에 새 요청을 제출하고 필요한만큼 반복합니다. Mockito의 MockRestServiceServer는 자신의 서버 API에 일부 코드를 포함 할 수 있으므로 해당 문서를 파헤쳐 볼 수 있습니다. –

+1

두 개의 API 호출을하는 웹 스크립트에서 하나의 함수를 테스트하려고합니다. 내가 말할 수있는 한, MockRestServiceServer에 두 개의 끝점을 선제 적으로 정의한 다음 함수를 호출 할 때 두 끝점이 모의 서버에 존재하도록 메서드를 실행 할 수는 없습니다. – AdvilPill

+0

@AdvillPill 좋습니다, 좋은 단기적인 수정은 두 개의 MockRestServiceServers를 실행하는 것일 수 있습니다. 각 MockRestServiceServers에는 고유 한 끝점이 있습니다. –

답변

-1

내 대답은 당신이 SpringBoot를 사용하고 있다고 가정하지만 그 생각은 일반적으로 적용될 수 있습니다.

테스트 할 때 스텁을 전달할 수 있도록 클래스를 RestOperations 인터페이스에 종속 시키십시오.

클래스에서 테스트

public void test() { 
    Foo foo = new Foo(new MyStub()); 
    } 

이 추상적이 아닌 구체적인 구현에 의존

public class Foo { 
    private final RestOperations restOperations; 

    public Foo(RestOperations restOperations) { 
    this.restOperations = restOperations; 
    } 
} 

테스트합니다.

2

그래서 실제로 문제를 해결할 수있었습니다.

MockRestServiceServer.MockRestServiceServerBuilder builder = 
    MockRestServiceServer.bindTo(restTemplate); 
builder.ignoreExpectOrder(true); 
MockRestServiceServer server = builder.build(); 

, 그래서 기본 RequestExpectationManager 필드를 수행하여 트릭은 수동과 같이() 메서드를 createServer (RestTemplate) 또는 bindTo (RestTemplate) .build를 사용하는 대신 MockRestServiceServer를 구축하기 위해 자신의 MockRestServiceServerBuilder를 만드는 것입니다 MockRestServiceServer는 UnorderedRequestExpectationManager로 초기화되어 요청한 순서에 상관없이 요청을 일치시킬 수 있습니다. 이것은 나를위한 두통을 해결했습니다.