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

时间:2015-11-30 23:56:24

标签: java android unit-testing junit

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

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

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

x

我在调查此问题时发现的一件事是,直接分配给PointF实例的<div class='bar'>字段可以正常工作。

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

2 个答案:

答案 0 :(得分:4)

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

当你运行单元测试时,你正在使用android jar的虚拟版本。通常情况下,您会看到&#34;方法...没有模拟。&#34;例外,但由于您直接访问公共字段,因此这些只是默认值。

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

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

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

解决方案并不漂亮:您需要针对模拟器或设备运行检测测试,或者转而使用类似Robolectric的测试运行器将替代&#39; shadows&#39;对你而言。

另见StackOverflow答案:android.graphics.Point: all methods are stubs

答案 1 :(得分:0)

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

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