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 楼答案
正如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