2016-01-25 139 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

相關問題