有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java测试Android DecimalFormat与Robolectric

Android库对DecimalFormat class进行了一些很好的修改。当然,我需要其中一个加法(符号数字表示法:@

当我使用Robolectric进行测试时,似乎使用了标准的Java DecimalFormat类,这使得我的测试失败

有没有办法告诉Robolectric使用Android版本?或者我应该在我的项目中包含DecimalFormat(从AOSP复制/粘贴类?)

下面是一个简单的例子:

如果我在以下设备上运行应用程序:

import java.text.DecimalFormat;
import java.util.Locale;

public class App extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        DecimalFormat decimalFormat = (DecimalFormat)java.text.NumberFormat.getInstance(Locale.US);
        decimalFormat.applyPattern("@@@");
        Log.d('SO', decimalFormat.format(0.0567467));
    }
}

它显示:

W/App: 0.0567

在单元测试中:

import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricGradleTestRunner;
import org.robolectric.annotation.Config;
import java.text.DecimalFormat;
import java.util.Locale;

import static junit.framework.TestCase.assertEquals;


@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class, sdk = 21)
public class NumberFormatTest {
    @Test
    public void testSignificantDigit() {
        DecimalFormat decimalFormat = (DecimalFormat)java.text.NumberFormat.getInstance(Locale.US);
        decimalFormat.applyPattern("@@@");
        assertEquals("0.0567", decimalFormat.format(0.0567467));
    }
}

运行测试将输出:

junit.framework.ComparisonFailure:

Expected :0.0567

Actual :@@@0


共 (1) 个答案

  1. # 1 楼答案

    正如official android documentation所述,在Android运行时(ART)中运行java代码时提供的实现与在常规JVM中的实现不同

    RoboeElectric不会在普通的android手机或模拟器上运行测试,而是在JVM上运行测试。在主机系统上运行的这个JVM没有DecimalFormat的这个修改后的运行时实现版本。因此,据我所知,在JVM中运行测试代码时,Android提供的功能不可用。为了能够使用它,可以在android手机上运行测试,但无论如何,你都可以不用RoboeElectric进行测试,但要使用offered testing tools

    另一个合乎逻辑的问题:为什么要测试Android类?我猜谷歌已经为这些变化编写了测试,并一直跟踪这些变化,所以you should no test functionality offered to you by the system you're using