2016-01-25 180 views
0

我正在尝试做一些单元测试,并且我还没有真正解决跑步者或测试课程。如何从模拟环境获取语言环境

最后,这是我验证它的工作方法:

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

    Locale locale = context.getResources().getConfiguration().locale; 
    MyObjectService myService = new MyObjectService(getRequestHeaders(context), locale); 
} 

所以,我需要有资源,配置,语言环境和SharedPreferences一个模拟环境。

我试过PowerMockito,AndroidTestCase,AndroidTestRunner,ApplicationTestCase。我所能得到的只是一个没有任何内容的模拟上下文,或模拟资源,但我无法弄清楚如何将它们添加到模拟上下文中(基本上是重新创建上下文)。

这是目前我的最后一次尝试(尽管我试图更复杂的,没有任何成功):

进口com.myApp.android.app.shop.util.ServiceUtils;

import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.mockito.Mockito; 
import org.powermock.modules.junit4.PowerMockRunner; 

import android.content.Context; 

@RunWith(PowerMockRunner.class) 
public class TestLogin 
{ 
    @Test 
    public void test() 
    { 
     Context context = Mockito.mock(Context.class); 
     ServiceUtils.getData(context, dataCallback); 
    } 
} 

我得到的异常是来自getData()的NPE,因为传递的上下文没有资源。

有什么建议吗?

回答

2

Android不是一个容易嘲弄的系统。我也尝试过使用Mockito来模拟框架,但它很快变得非常复杂。像资源和SharedPreferences这样的东西不容易模拟。 Robolectric等第三方API已经解决了这些问题。

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

+0

谢谢您的回答每次。到目前为止,我已经能够进行基本测试的robolectric工作,但是我一直无法验证回调的价值。你会知道该怎么做吗? – TooManyEduardos

0

通过Robolectric

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

我刚刚做了,但我无法弄清楚如何验证在改造回调(1。9) – TooManyEduardos

+0

,这是另一个问题:) –

+0

哈哈......是:(你的意思“验证响应”什么在哪里寻找呢? – TooManyEduardos

0

使用RuntimeEnvironment作为第二个答案(也许比第一个更有益的)我建议你到逻辑从平台的依赖分裂。

通过这种方式,您可以考虑以纯java方式对单元进行单元测试。

看看MVP模式。它应该有很大帮助!

在这种情况下,例如,你会提出这条线......

MyObjectService myService = new MyObjectService(getRequestHeaders(context), locale); 

...内“服务”是完全需要一个构造函数分配一个纯Java类(在这种情况下)称为“locale”的字符串值和称为“标题”的数据结构

简单,不是吗? ;)

我的2美分:你需要Robolectric测试逻辑(而不是UI),你可能犯了一个错误

+0

是啊,这是一个选项,我们可以打散的方法。我一直在寻找一个选项来测试针对现有的方法和网络呼叫。 – TooManyEduardos

相关问题