gpt4 book ai didi

Android JUnit 测试不能调用任何 android api?

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:37:39 26 4
gpt4 key购买 nike

来自 Android 的测试基础,“您可以使用普通 JUnit 来测试不调用 Android API 的类,或者使用 Android 的 JUnit 扩展来测试 Android 组件。”我相信这就是以下测试中的 spanString 为空的原因。有人可以确认这是原因吗?

import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class SpanPainterTest {
@Test
public void appliesColorPerRange () {
SpannablesString spanString = new SpannableString("Aa Bb");
SpanPainter painter = new SpanPainter(new ForegroundColorSpan(10));
SpannableString coloredSpan =
painter.applyColor(spanString, new Pair<Integer, Integer>(0,1));
ForegroundColorSpan[] colorArr =
coloredSpan.getSpans(0,0, ForegroundColorSpan.class);
assertEquals(10, colorArr[0]);
}
}

这是 SpanPainter.java

public class SpanPainter {
ForegroundColorSpan color;
public SpanPainter (ForegroundColorSpan color) {
this.color = color;
}

public SpannableString applyColor(SpannableString span,
Pair<Integer, Integer> pair) {
span.setSpan(color,pair.first, pair.second, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
return span;
}
}

但它说“使用 Android 的 JUnit 扩展来测试 android 组件。所以我扩展了 AndroidTestCase,但 spanString 仍然等于 null。这让我认为没有单元测试可以使用 android api 对象而不将它设置为 null。是吗?对吗?(这是我的第二个问题。)这是作为 AndroidTestCase 的 SpanPainter 测试,结果是 spanString = null。

public class SpanPainterTest extends AndroidTestCase {
@SmallTest
public void testAppliesColorPerRange () {
SpannableString spanString = new SpannableString("Aa Bb");
SpanPainter painter = new SpanPainter(new ForegroundColorSpan(10));
...same as above.
assertEquals(9, colorArr[0]);
}
}

这是我的两个 JUnit 问题。如果我不扩展 AndroidTestCase,那么使用 android api 中的任何对象都会导致 null。如果我扩展 AndroidTestCase,来自 android api 的任何对象都会自动设置为 null。

最佳答案

我在使用 SpannableStringBuilder 时遇到了类似的问题。通过将我的测试移动到 androidTest 目录,我的问题得到了解决。 (感谢 this answer 的建议。)

enter image description here

这是在新位置进行的测试:

/**
* Instrumentation test, which will execute on an Android device.
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {

@Test
public void myStringTest() throws Exception {
CharSequence unicode = "";
MyClass myClass = new MyClass(unicode);
CharSequence result = myClass.getUnicodeText(); // uses SpannableStringBuilder internally
CharSequence expected = unicode;
assertEquals(expected, result);
}
}

注意

你也可以试试mocking the Android classes ,但这对于像我这样的测试初学者来说要容易得多。我想缺点是仪器测试比单元测试运行得慢。

关于Android JUnit 测试不能调用任何 android api?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31973481/

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