泽西岛客户:测试外部呼叫
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                泽西岛客户:测试外部呼叫
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                
 吉姆和我在上周一直在做一些工作,其中涉及調用neo4j的HA狀態URI來檢查實例是否是主/從屬,并且我們一直在使用jersey-client 。 
該代碼大致如下所示: 
在針對該代碼編寫一些測試時,我們希望保留對HA從URI的實際調用,以便我們可以模擬這兩種情況,并且進行簡短搜索表明,使用Mockito是可行的方法 。
我們最終進行了如下所示的測試:
@Test public void shouldIndicateInstanceIsSlave() {Client client = mock( Client.class );WebResource webResource = mock( WebResource.class );WebResource.Builder builder = mock( WebResource.Builder.class );ClientResponse clientResponse = mock( ClientResponse.class );when( builder.get( ClientResponse.class ) ).thenReturn( clientResponse );when( clientResponse.getEntity( String.class ) ).thenReturn( "true" );when( webResource.accept( anyString() ) ).thenReturn( builder );when( client.resource( anyString() ) ).thenReturn( webResource );Boolean isSlave = new Neo4jInstance(client, URI.create("http://localhost")).isSlave();assertTrue(isSlave); }這很粗糙,但是可以完成工作。
我認為應該有更好的方法,所以我繼續搜索,最終在郵件列表中發現了此帖子,該帖子建議創建一個自定義ClientHandler并在其中存儲請求/響應。
我可以這樣做,并用一個僅覆蓋我們非常具體的用例的小DSL進行包裝:
private static ClientBuilder client() {return new ClientBuilder(); }static class ClientBuilder {private String uri;private int statusCode;private String content;public ClientBuilder requestFor(String uri) {this.uri = uri;return this;}public ClientBuilder returns(int statusCode) {this.statusCode = statusCode;return this;}public Client create() {return new Client() {public ClientResponse handle(ClientRequest request) throws ClientHandlerException {if (request.getURI().toString().equals(uri)) {InBoundHeaders headers = new InBoundHeaders();headers.put("Content-Type", asList("text/plain"));return createDummyResponse(headers);}throw new RuntimeException("No stub defined for " + request.getURI());}};}private ClientResponse createDummyResponse(InBoundHeaders headers) {return new ClientResponse(statusCode, headers, new ByteArrayInputStream(content.getBytes()), messageBodyWorkers());}private MessageBodyWorkers messageBodyWorkers() {return new MessageBodyWorkers() {public Map<MediaType, List<MessageBodyReader>> getReaders(MediaType mediaType) {return null;}public Map<MediaType, List<MessageBodyWriter>> getWriters(MediaType mediaType) {return null;}public String readersToString(Map<MediaType, List<MessageBodyReader>> mediaTypeListMap) {return null;}public String writersToString(Map<MediaType, List<MessageBodyWriter>> mediaTypeListMap) {return null;}public <T> MessageBodyReader<T> getMessageBodyReader(Class<T> tClass, Type type, Annotation[] annotations, MediaType mediaType) {return (MessageBodyReader<T>) new StringProvider();}public <T> MessageBodyWriter<T> getMessageBodyWriter(Class<T> tClass, Type type, Annotation[] annotations, MediaType mediaType) {return null;}public <T> List<MediaType> getMessageBodyWriterMediaTypes(Class<T> tClass, Type type, Annotation[] annotations) {return null;}public <T> MediaType getMessageBodyWriterMediaType(Class<T> tClass, Type type, Annotation[] annotations, List<MediaType> mediaTypes) {return null;}};}public ClientBuilder content(String content) {this.content = content;return this;} }如果我們更改測試以使用此代碼,則現在看起來像這樣:
@Test public void shouldIndicateInstanceIsSlave() {Client client = client().requestFor("http://localhost:7474/db/manage/server/ha/slave").returns(200).content("true").create();Boolean isSlave = new Neo4jInstance(client, URI.create("http://localhost")).isSlave();assertTrue(isSlave); }有沒有更好的辦法?
在Ruby中,我使用WebMock來實現這一目標,而Ashok 則將我指向WebStub ,它看起來不錯,除了我需要傳遞主機名+端口而不是在代碼中構造它。
參考: 澤西島客戶:在Mark Needham博客博客中測試 JCG合作伙伴 Mark Needham的外部呼叫 。翻譯自: https://www.javacodegeeks.com/2013/08/jersey-client-testing-external-calls.html
總結
以上是生活随笔為你收集整理的泽西岛客户:测试外部呼叫的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 云闪付转账转账记录怎么查?
- 下一篇: 华兴定存宝福利券怎样用?
