Java Android PointF构造函数在JUnit测试中不起作用

Java Android PointF构造函数在JUnit测试中不起作用,java,android,unit-testing,junit,Java,Android,Unit Testing,Junit,我在尝试编写JUnit测试时偶然发现了这一点。诚然,这是我在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

我在尝试编写JUnit测试时偶然发现了这一点。诚然,这是我在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类的类呢?

请参见

当您运行单元测试时,您使用的是android jar的虚拟版本。通常您会看到“Method…not mocked.”异常,但由于您直接访问公共字段,所以这些只是默认值

根据您的需求,您可以使用一个伪类:您自己的子类扩展PointF

    public static class FakePointF extends PointF {
        FakePointF(float x, float y) {
            this.x = x;
            this.y = y;
        }
    }
但在一个更复杂的测试中,您可能最终不得不模拟许多其他方法

解决方案并不完美:您需要对仿真器或设备运行插入指令的测试,或者使用Robolectric之类的工具,测试运行程序将用“”代替您


还可以看到StackOverflow的回答:。

我真的很惊讶,在
JUnit
测试中,有些类的行为确实是这样的。我不认为这是一个简单的<代码> DTO < /代码>类,如<代码>点>代码>,但是把它看作是一个讨厌的<代码>复活节< /代码>蛋,这使得程序员的生活更加困难。我可以接受像
Draw
等方法被模拟,因为它们可能严重依赖于硬件,但这样的DTO不应该被模拟


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

你有没有尝试过用调试器查看
PointF
对象?@StefanBirkner是的,它说两个字段都是“0.0”。你能在构造函数的第一行设置一个断点吗?是的,执行似乎没有达到那个断点。我也尝试过进入构造器,执行线指向一条注释。谢谢!这是有道理的。不过这很烦人,希望它至少能提供像
PointF
这样的简单类的实现。