2015-04-15 55 views
6

我正在使用Junit4語法通過android測試支持庫(here)爲Android編寫單元測試。我想測試我的自定義視圖。測試包括點擊複選框,並確保在另一個地方的值被正確地更新,但是當我嘗試運行測試,我得到這個錯誤:UI線程上的Android Junit4測試

android.util.AndroidRuntimeException: Animators may only be run on Looper threads 
at android.animation.ValueAnimator.start(ValueAnimator.java:1002) 
at android.animation.ValueAnimator.start(ValueAnimator.java:1050) 
at android.animation.ObjectAnimator.start(ObjectAnimator.java:829) 
at android.graphics.drawable.AnimatedStateListDrawable$AnimationDrawableTransition.start(AnimatedStateListDrawable.java:294) 
at android.graphics.drawable.AnimatedStateListDrawable.selectTransition(AnimatedStateListDrawable.java:226) 
at android.graphics.drawable.AnimatedStateListDrawable.onStateChange(AnimatedStateListDrawable.java:145) 
at android.graphics.drawable.Drawable.setState(Drawable.java:599) 
at android.widget.CompoundButton.drawableStateChanged(CompoundButton.java:438) 
at android.view.View.refreshDrawableState(View.java:16032) 
at android.widget.CompoundButton.setChecked(CompoundButton.java:143) 
at android.widget.CompoundButton.toggle(CompoundButton.java:113) 

我沒有定義任何自定義動畫我並不真正關心他們進行這個測試,但我認爲它是創建複選框動畫的Android 5.0材質主題。

我假設引發異常是因爲測試不能在UI線程上運行,並且動畫製作者無法制作動畫。那麼如何在UI線程上運行測試呢?

回答

17

使用InstrumentationRegistry.getInstrumentation().runOnMainSync()

/*** 
    Copyright (c) 2008-2015 CommonsWare, LLC 
    Licensed under the Apache License, Version 2.0 (the "License"); you may not 
    use this file except in compliance with the License. You may obtain a copy 
    of the License at http://www.apache.org/licenses/LICENSE-2.0. Unless required 
    by applicable law or agreed to in writing, software distributed under the 
    License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS 
    OF ANY KIND, either express or implied. See the License for the specific 
    language governing permissions and limitations under the License. 

    From _The Busy Coder's Guide to Android Development_ 
     http://commonsware.com/Android 
*/ 

package com.commonsware.android.abf.test; 

import android.support.test.InstrumentationRegistry; 
import android.support.test.runner.AndroidJUnit4; 
import android.test.AndroidTestCase; 
import android.test.UiThreadTest; 
import android.view.LayoutInflater; 
import android.view.View; 
import com.commonsware.android.abf.R; 
import junit.framework.Assert; 
import org.junit.Before; 
import org.junit.Test; 
import org.junit.runner.RunWith; 

@RunWith(AndroidJUnit4.class) 
public class DemoContextTest { 
    private View field=null; 
    private View root=null; 

    @Before 
    public void init() { 
    InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() { 
     @Override 
     public void run() { 
     LayoutInflater inflater=LayoutInflater 
      .from(InstrumentationRegistry.getTargetContext()); 

     root=inflater.inflate(R.layout.add, null); 
     } 
    }); 

    root.measure(800, 480); 
    root.layout(0, 0, 800, 480); 

    field=root.findViewById(R.id.title); 
    } 

    @Test 
    public void exists() { 
    init(); 
    Assert.assertNotNull(field); 
    } 

    @Test 
    public void position() { 
    init(); 
    Assert.assertEquals(0, field.getTop()); 
    Assert.assertEquals(0, field.getLeft()); 
    } 
} 

(從this sample project

+0

這太神奇了THANK YOU! – Tony