2015-11-30 52 views
3

我在试图编写JUnit测试时偶然发现了这一点。无可否认,这是我在JUnit中的第一次单元测试,但我确实发现这种行为非常令人费解。Android PointF构造函数不能在JUnit测试中工作

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类的类?

+0

您是否尝试过使用调试器查看'PointF'对象? –

+0

@StefanBirkner是的,它说这些字段都是'0.0'。 – dom96

+0

你能在构造函数的第一行设置一个断点吗? –

回答

2

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

当您运行单元测试,使用的是Android的罐子的虚拟版本。通常情况下,您会看到“Method ... not mocked”异常,但由于您直接访问公共字段,因此这些只是默认值。

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

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

但在一个更复杂的测试,你可能会最终不得不嘲笑了一大堆的其他方法。

解决方案并不十分漂亮:您需要针对仿真器或设备运行插装测试,或者转向使用Robolectric等测试运行器替代'shadows'的代码。

另请参阅此StackOverflow答案:android.graphics.Point: all methods are stubs

+1

谢谢!这就说得通了。虽然很烦人,但希望它至少能提供像''PointF''这样的简单类的实现。 – dom96

0

我真的很惊讶,有些课程在JUnit测试中表现得如此。在Point这类简单的DTO类的情况下,我认为没有什么好的理由,但应将其视为令人讨厌的Easter鸡蛋,这会让程序员的生活变得更加困难。我会接受像Draw等方法被嘲笑,因为它们可能严重依赖于硬件,但是这样的DTO不应该被嘲笑。

我仍然在学习Android开发,但我看到的东西越多,我越相信它不是一个成熟的,思想深刻的框架。