Android PointF构造函数不能在JUnit测试中工作

我在尝试编写JUnit测试时偶然发现了这一点。 不可否认,这是我在JUnit中的第一次unit testing,但我发现这种行为非常令人费解。

package com.example.dom.pointfbugrepro; import android.graphics.PointF; import org.junit.Test; import static org.junit.Assert.*; public class ExampleUnitTest { @Test public void pointf_isCorrect() throws Exception { PointF foo = new PointF(5, 0); assertEquals(5, foo.x, 0.0001f); } } 

在全新的Android项目中运行此测试会导致断言失败:

 java.lang.AssertionError: Expected :5.0 Actual :0.0 

我在研究这个问题时发现的一件事是,直接分配给PointF实例的x字段确实有效。

那么这里的问题是什么? 为什么构造函数没有正确设置字段? 我应该如何测试使用PointF Android类的类?

请参阅http://tools.android.com/tech-docs/unit-testing-support#TOC-Method-…-not-mocked.-

当你运行unit testing时,你正在使用android jar的虚拟版本。 通常,您会看到“方法…未模拟。”exception,但由于您直接访问公共字段,因此这些只是默认值。

根据您的要求,您可以使用伪造的:您自己的子类扩展PointF

  public static class FakePointF extends PointF { FakePointF(float x, float y) { this.x = x; this.y = y; } } 

但是在一个更复杂的测试中,你可能最终不得不嘲笑其他很多方法。

解决方案并不漂亮:您需要针对模拟器或设备运行检测测试,或者转而使用Robolectric之类的测试运行器替代“ 阴影 ”。

另请参阅此StackOverflow答案: android.graphics.Point:所有方法都是存根 。

我真的很惊讶有些类在JUnit测试中表现得像这样。 对于像Point这样的简单DTO类,我没有看到任何合理的理由,而是认为这是一个讨厌的Easter彩蛋,它使程序员的生活更加艰难。 我会接受像Draw等方法被嘲笑,因为它们可能依赖于硬件,但是这样的DTO不应该被嘲笑。

我还在学习Android开发,但是我看到的东西越多,我就越相信它不是一个成熟且经过深思熟虑的框架。