Java 如何从模拟上下文中获取区域设置

Java 如何从模拟上下文中获取区域设置,java,android,unit-testing,junit,mockito,Java,Android,Unit Testing,Junit,Mockito,我正在尝试做一些单元测试,但我还没有真正确定一个跑步者或测试类 最后,我要验证的方法是: public static void getData(final Context context, final Callback<MyObject> callback) { Locale locale = context.getResources().getConfiguration().locale; MyObjectService myService = new MyObj

我正在尝试做一些单元测试,但我还没有真正确定一个跑步者或测试类

最后,我要验证的方法是:

public static void getData(final Context context, final Callback<MyObject> callback) {

    Locale locale = context.getResources().getConfiguration().locale;
    MyObjectService myService = new MyObjectService(getRequestHeaders(context), locale);
}
我得到的异常是getData()中的NPE,因为传递的上下文没有资源


有什么建议吗?

Android不是一个容易模仿的系统。我也尝试过使用Mockito来模拟框架,但它很快就会变得非常复杂。资源和共享引用之类的东西不容易模仿。这些问题已在第三方API(如Robolectric)中解决


我建议您使用Android单元测试。Robolectric在标准VM中运行(即不需要模拟器)。Robolectric模拟了大部分Android系统,从而最小化(但不是消除)构建模拟的需要。我发现它是Android TDD的一个非常有用的工具。

Android不是一个容易模仿的系统。我也尝试过使用Mockito来模拟框架,但它很快就会变得非常复杂。资源和共享引用之类的东西不容易模仿。这些问题已在第三方API(如Robolectric)中解决


我建议您使用Android单元测试。Robolectric在标准VM中运行(即不需要模拟器)。Robolectric模拟了大部分Android系统,从而最小化(但不是消除)构建模拟的需要。我发现它是Android TDD的一个非常有用的工具。

使用Robolectric的RuntimeEnvironment

Locale locale = RuntimeEnvironment.application.getResources().getConfiguration().locale;

通过Robolectric使用RuntimeEnvironment

Locale locale = RuntimeEnvironment.application.getResources().getConfiguration().locale;
作为第二个答案(可能比第一个更有用),我建议您将逻辑从平台的依赖项中分离出来

这样,您可以考虑用纯java方式进行单元测试。

看看MVP模式。这应该会有很大帮助

在这种情况下,例如,您将移动这条线

MyObjectService myService = new MyObjectService(getRequestHeaders(context), locale);
。。。在完全由构造函数分配的纯java类“服务”内部,构造函数需要(在本例中)名为“locale”的字符串值和名为“headers”的数据结构

容易,不是吗

我的2美分:每次您需要Robolectric来测试逻辑(而不是UI)时,您可能会犯一个错误作为第二个答案(可能比第一个更有用),我建议您将逻辑从平台的依赖项中分离出来

这样,您可以考虑用纯java方式进行单元测试。

看看MVP模式。这应该会有很大帮助

在这种情况下,例如,您将移动这条线

MyObjectService myService = new MyObjectService(getRequestHeaders(context), locale);
。。。在完全由构造函数分配的纯java类“服务”内部,构造函数需要(在本例中)名为“locale”的字符串值和名为“headers”的数据结构

容易,不是吗


我的2美分:每次你需要Robolectric来测试逻辑(而不是UI)时,你可能会犯错误

谢谢你的回答。到目前为止,我已经能够在基本测试中使用robolectric,但是我无法验证回调返回的值。你知道怎么做吗?谢谢你的回答。到目前为止,我已经能够在基本测试中使用robolectric,但是我无法验证回调返回的值。你知道怎么做吗?我刚做了,但我不知道如何验证改装(1.9)回调中的响应这是另一个问题:)你说的“验证响应”是什么意思?我现在使用的是Robolectric,我得到的网络数据如下:“ServiceUtils.getData(context,dataCallback);”这是在Before方法或测试方法中。两者都有效。但是改型回调返回一个成功和失败的方法。在success方法中,它返回一个对象。我需要用Robolectric(或任何真正的东西)验证这个对象,以验证数据是否是正确的对象类型以及其中是否包含正确的元素。我刚刚验证了,但我不知道如何验证来自改装(1.9)的回调中的响应。这是另一个问题:)你说的“验证响应”是什么意思?我现在使用的是Robolectric,我得到的网络数据如下:“ServiceUtils.getData(context,dataCallback);”这是Before方法或Test方法。两者都有效。但是改型回调返回一个成功和失败的方法。在success方法中,它返回一个对象。我需要用Robolectric(或任何真正的东西)来验证这个对象,以验证数据是正确的对象类型,并且其中包含正确的元素。是的,这是一个选项,我们可以将这些方法分开。我正在寻找一个选项来测试现有的方法和网络调用。是的,这是一个选项,我们可以将这些方法分开。我正在寻找一个选项来测试现有的方法和网络调用。