我在尝试编写JUnit测试时偶然发现了这一点。不可否认,这是我在JUnit中的第一次单元测试,但我发现这种行为非常令人费解。
java.lang.AssertionError:
Expected :5.0
Actual :0.0
在全新的Android项目中运行此测试会导致断言失败:
x
我在调查此问题时发现的一件事是,直接分配给PointF实例的<div class='bar'>
字段可以正常工作。
那么这里有什么问题?为什么构造函数没有正确设置字段?我应该如何测试使用PointF Android类的类?
答案 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
开发,但我看到的事情越多,我就越相信它不是一个成熟且经过深思熟虑的框架。