2016-06-02 6 views
0

저는 REST 서비스에서 PNG 이미지를 다운로드하여 Bitmap으로 변형하고이 라이브러리를 사용하여 앱으로 반환해야하는 Android 라이브러리 프로젝트에서 작업하고 있습니다. 따라서 PNG 이미지의 바이트를 반환하는 REST 웹 서비스가 있습니다. 우리는 RetrofitrxJava을 사용하여이 서비스를 호출합니다. 아래 코드 내 accessRemoteComm.getImage()에서 ResponseBody에서 Bitmap으로 Observable의 .map 내부로 로딩하고 변환합니다. 응용 프로그램에서 이미지가 잘로드됩니다. 이제 단위 테스트를하고 싶지만, 처음에는 이미지를 전달하기가 어려워요. MockWebServer.어떻게 OkHttpClient MockWebSever를 사용하여 이미지/바이트 []를 반환 할 수 있습니까?

개조 인터페이스 :

@GET("webapi/user/{ID}/image") 
Observable<ResponseBody> getVehicleImage(
     @Path("ID") @NonNull final String id, 
     @Query("width") @NonNull final int width, 
     @Query("height") @NonNull final int height, 
     @Query("view") @NonNull final ImageView view 
); 

된 GetImage() 방법 :

java.lang.RuntimeException: Method decodeStream in android.graphics.BitmapFactory not mocked. See http://g.co/androidstudio/not-mocked for details.

이것은 내가 지금까지 가지고있는 경우 : OnError는 끊임없이라고

public Observable<Bitmap> getVehicleImage(@NonNull String id, @NonNull Integer width, @NonNull Integer height, @NonNull ImageView view) { 
    return service.getImage(id, width, height, view).map(new Func1<ResponseBody, Bitmap>() { 
     @Override 
     public Bitmap call(ResponseBody responseBody) { 
      BufferedInputStream isr = new BufferedInputStream(responseBody.byteStream()); 
      return BitmapFactory.decodeStream(isr); 
     } 
    }); 
} 

내 시험 방법 :

@Test 
public void testGetVehicleImage() throws Exception { 

    String path = basePathForImages + "vehicleTestImage.png"; 

    Source pngSource = Okio.source(new File(path)); 

    BufferedSource bufferedSrc = Okio.buffer(pngSource); 

    server.enqueue(new MockResponse() 
      .setResponseCode(200) 
      .setHeader("Content-Type", "image/png") 
      .setBody(bufferedSrc.buffer())); 

    Subscriber<Bitmap> subscriber = new Subscriber<Bitmap>() { 
     @Override 
     public void onCompleted() { 
      Log.d("OnComplete"); 
     } 

     @Override 
     public void onError(Throwable e) { 
      Log.d(e.toString()); 
      //java.lang.RuntimeException: 
      //Method decodeStream in android.graphics.BitmapFactory not mocked. 
     } 

     @Override 
     public void onNext(Bitmap bitmap) { 
      Log.d("Yeeee"); 
     } 
    }; 

    Observable<Bitmap> observable = accessRemoteCommVehicle.getVehicleImage("abc", 0, 0, VehicleImageView.FRONT); 

    observable.toBlocking().subscribe(subscriber); 
} 

나는 내가 bufferedSource 제대로 설치하지 않는 것을 확신합니다. 그러나 Buffer을 본문으로 사용하는 MockResponse의 사용을 보여주는 SO 또는 웹상의 자원을 찾을 수 없습니다. 그리고 이것이 도움이되는 부분입니다. 어떻게 이것을 올바르게 설정합니까?

btw. 이 테스트 방법에 대한 다른 제안 사항이 있으면 알려 주시기 바랍니다.

감사합니다.

답변

1

현재 MockWebServer와 함께 사용 중이며 작동하는 것으로 보입니다. 그러나 약간의 마일리지를 사용할 수 있습니다. 시도하고 결과를 피드백하면 커뮤니티에 도움이 될 것입니다.

  import okio.Buffer; 
     private final static String TAG = "MYCLASS"; 
     public static String extPathToPngFile = Environment.getExternalStorageDirectory().getPath() + "/some-icon.png"; 

     Buffer responseBody = getBinaryFileAsBuffer(extPathToPngFile); 

          ... context removed for brevity ... 

     new MockResponse().setResponseCode(200).addHeader("Content-Type:image/png").setBody(responseBody); 

     //Buffer wrap a binary file to return with a mock. 
     public static Buffer getBinaryFileAsBuffer(String path) throws IOException { 
         File file = new File(path); 
         byte[] fileData = FileUtils.readFileToByteArray(file); 
         Buffer buf = new Buffer(); 
         buf.write(fileData); 
         Log.d(TAG, "BUFFER SIZE FOR "+path+" IS:" + buf.size()); 
         return buf; 
        }