【问题标题】:Android JUnit tests can't call any android api?Android JUnit测试不能调用任何android api?
【发布时间】:2015-08-12 19:08:28
【问题描述】:

来自 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。

【问题讨论】:

    标签: android unit-testing junit


    【解决方案1】:

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

    这里是新位置的测试:

    /**
     * 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,但这对于像我这样的测试初学者来说要容易得多。我想,缺点是仪器测试比单元测试运行得慢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-11
      • 1970-01-01
      • 2020-12-07
      • 2012-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-01
      相关资源
      最近更新 更多