gpt4 book ai didi

UI线程上的Android Junit4测试

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:23:27 25 4
gpt4 key购买 nike

我正在使用 Junit4 语法通过 Android 测试支持库 (here) 为 Android 编写单元测试。我想测试我的自定义 View 。测试涉及单击复选框并确保正确更新另一个位置的值,但是当我尝试运行测试时出现此错误:

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 Material 主题。

我假设抛出异常是因为测试未在 UI 线程上运行并且动画师无法制作动画。那么如何在 UI 线程上运行测试呢?

最佳答案

使用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)

关于UI线程上的Android Junit4测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29662696/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com