2013-11-01 43 views
13

我一直在使用Robolectric進行測試,這一切都很棒。然後,我將Google Analytics(分析)應用於我的應用程序類,並且測試開始失敗。在測試過程中充氣時,失敗似乎會發生。這裏的堆棧跟蹤:Robolectric和Google Analytics測試錯誤

java.lang.NullPointerException: null 
at com.google.analytics.tracking.android.AnalyticsGmsCoreClient$AnalyticsServiceConnection.onServiceConnected(AnalyticsGmsCoreClient.java:176) 
at org.robolectric.shadows.ShadowApplication$2.run(ShadowApplication.java:209) 
at org.robolectric.util.Scheduler$PostedRunnable.run(Scheduler.java:162) 
at org.robolectric.util.Scheduler.runOneTask(Scheduler.java:107) 
at org.robolectric.util.Scheduler.advanceTo(Scheduler.java:92) 
at org.robolectric.util.Scheduler.advanceToLastPostedRunnable(Scheduler.java:68) 
at org.robolectric.util.Scheduler.unPause(Scheduler.java:25) 
at org.robolectric.shadows.ShadowLooper.unPause(ShadowLooper.java:219) 
at org.robolectric.shadows.ShadowLooper.runPaused(ShadowLooper.java:258) 
at org.robolectric.shadows.ShadowViewGroup.addView(ShadowViewGroup.java:32) 
at android.view.ViewGroup.addView(ViewGroup.java) 
at android.view.ViewGroup.addView(ViewGroup.java:3225) 
at android.view.LayoutInflater.rInflate(LayoutInflater.java:750) 
at android.view.LayoutInflater.inflate(LayoutInflater.java:489) 
at android.view.LayoutInflater.inflate(LayoutInflater.java:396) 
at android.view.LayoutInflater.inflate(LayoutInflater.java:352) 
at org.robolectric.shadows.ShadowView.inflate(ShadowView.java:82) 
at android.view.View.inflate(View.java) 

下面是我的BaseActivity的Robolectric代碼:

@RunWith(RobolectricTestRunner.class) 
public class BaseActivityTest { 

ActivityController<TestActivity> activityController; 
TestActivity activity; 

@Before 
public void setUp(){ 
    activityController = Robolectric.buildActivity(TestActivity.class).create().start(); 
} 


@After 
public void takeDown(){ 
    activityController.stop().destroy(); 
    activity = null; 
} 

@Test 
public void testOnPauseState(){ 
    activity = activityController.resume().pause().get(); 
    assertFalse(activity.getBus().isActive()); 
} 
} 

Google Analytics example,我的應用程序類實現谷歌Analytics(分析)。每當我用我的應用程序運行測試時,就會發生中斷。我嘗試過實現Robolectric的MockApplication對象,但這沒有任何改變;我必須從我的應用程序對象中刪除Google Analytics才能使用它。有沒有人有任何解決方案可以讓我使用Google Analytics運行Robolectric?

回答

3

我給你兩個建議,如果你正在使用谷歌Analytics(分析)V3:

1)你有沒有打過電話,當你運行你的測試這種方法嗎?

googleAnalytics.setAppOptOut(true); 

這將禁用測試生命週期的谷歌分析。

2)創建在同一封裝測試應用類作爲當前的應用程序並將其命名爲同一個名稱,但前面加上「測試」的名字。此應用程序將在測試期間創建,您可以將「setAppOptOut」設置爲true,或者可以完全忽略GoogleAnalytics。

更多信息可以在這裏找到:http://robolectric.blogspot.com/2013/04/the-test-lifecycle-in-20.html

+1

第二個選項工作。要記住鏈接中解釋的一件重要事情是,應用程序類必須位於同一個包中(並且與測試應用程序類中的「Test」具有相同的名稱)。第一種選擇儘管有意義,但在測試過程中似乎沒有註冊。 – Maxwell

+0

第一個選項不爲我工作,由於它未能在'GoogleAnalytics.getInstance(這)'因此它永遠不會到達包含'setAppOptOut(真)行' –

19

有,如果以前的職位不工作另一種解決方案。獲取影子應用程序的句柄並將其配置爲忽略分析開始意圖綁定。在您的測試設置中執行此操作。

@Before 
public void setup() { 
    ShadowApplication shadowApplication = Robolectric.shadowOf(Robolectric.application); 
    shadowApplication.declareActionUnbindable("com.google.android.gms.analytics.service.START"); 
} 
+0

該解決方案爲我工作。 – Louth

+0

這應該放在哪裏?在測試的setup()中? – loeschg

+1

我已經在我的設置()中得到了它,它的工作原理。 – Jeroen

2

我嘗試了所有上述解決方案,但都沒有爲我工作。這終於做到:

public class TestFooApplication extends FooApplication { 
    @Override 
    public boolean bindService(Intent service, ServiceConnection conn, int flags) { 
     return false; 
    } 
}