2015-09-25 79 views
1

我希望能夠將Espresso監視器Picasso作爲IdlingResource,以便我可以在圖像加載成功後運行ViewMatcher監測濃縮咖啡中IdlingResource的畢加索

從瀏覽Picasso源代碼,我不明白爲什麼這不起作用。下面是我的嘗試:

Picasso picasso = new Picasso.Builder(context).build(); 
Field dispatcherField = Picasso.class.getDeclaredField("dispatcher"); 
dispatcherField.setAccessible(true); 

try { 
    Dispatcher dispatcher = (Dispatcher) dispatcherField.get(picasso); 
    Espresso.registerLooperAsIdlingResource(dispatcher.dispatcherThread.getLooper()); 
} catch (NoSuchFieldException e) { 
    throw new PicassoHasBeenRefactoredException(); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

onView(withId(R.id.image_view)).check(matches(withImage(R.drawable.drawable))); 

(是的,我知道的,反映是噁心,但我找不到才能上Looper一個手柄的另一種方式)

但是,試圖當它導致這個錯誤從ImageView得到Bitmap

java.lang.NullPointerException: Attempt to invoke virtual method 'android.graphics.Bitmap android.graphics.drawable.BitmapDrawable.getBitmap()' on a null object reference 

要檢查預期一旦圖像已加載測試運行,我想代替IdlingResource檢查的的引入Thread.sleep(1000)它通過了。

可以肯定IdlingResource設置不正確,更重要的是,在檢查Espresso視圖之前等待Picasso完成加載的正確方法是什麼?

+0

不能使用[onSucess回調(https://square.github.io/picasso/javadoc/com/squareup/picasso/Callback.html #onSuccess--)從畢加索設置您的IdelingResource? –

+0

@RahulTiwari我不想修改任何生產代碼來適應測試,除非你的意思是別的嗎? –

+0

我在談論使用回調畢加索提供'onSuccess'和'onError'並儘可能地去除反射。所以是的,我在談論修改代碼,但它不會影響任何功能。 –

回答

2

我正在使用IdlingResource來檢查是否還有其他操作。

注意,IdlingResource必須住在同一個包畢加索來訪問一個包保護變量

package com.squareup.picasso; 

public class PicassoIdlingResource implements IdlingResource, ActivityLifecycleCallback { 
    protected ResourceCallback callback; 

    WeakReference<Picasso> picassoWeakReference; 

    @Override 
    public String getName() { 
    return "PicassoIdlingResource"; 
    } 

    @Override 
    public boolean isIdleNow() { 
    if (isIdle()) { 
     notifyDone(); 
     return true; 
    } else { 
     return false; 
    } 
    } 

    public boolean isIdle() { 
    return picassoWeakReference == null 
      || picassoWeakReference.get() == null 
      || picassoWeakReference.get().targetToAction.isEmpty(); 
    } 

    @Override 
    public void registerIdleTransitionCallback(ResourceCallback resourceCallback) { 
    this.callback = resourceCallback; 
    } 

    void notifyDone() { 
    if (callback != null) { 
     callback.onTransitionToIdle(); 
    } 
    } 

    @Override 
    public void onActivityLifecycleChanged(Activity activity, Stage stage) { 
    switch (stage) { 
     case CREATED: 
     picassoWeakReference = new WeakReference<>(Picasso.with(activity)); 
     break; 
     case STOPPED: 
     // Clean up reference 
     picassoWeakReference = null; 
     break; 
     default: // NOP 
    } 
    } 
} 

我不認爲使用WeakReference的是需要的,但它也沒有破壞。

此外,我已經確定了一個案例,它不會等到畢加索結束(使用.load(null))。所以,請自擔風險,如果您改進,請回來。

見的全部細節和使用要點(https://gist.github.com/Maragues/0c0db81a137c8d067396

+0

謝謝!在活動之間移動時,解決方案無法正常工作。爲了解決這個問題,我用** RESUMED&PAUSED **取代了狀態CREATED&STOPPED ** –

+0

我還發現這導致了大的延遲(每個圖像加載**導致**延遲5秒),因爲Espresso在重新啓動之間有幾秒鐘的延遲,檢查。解決方法是強制重新檢查PicassoIdlingResource,如下例所示:https://gist.github.com/vaughandroid/e2fda716c7cf6853fa79#file-viewvisibilityidlingresource-java-L62 –

+0

謝謝@SebasLG,我目前正在另一個項目中,一旦我回到舊的代碼,就會檢查你的代碼。 – Maragues