2016-02-05 80 views
3

我已經寫了一個類來管理android應用程序項目中的日誌記錄。 LogManager基本上是android.util.log的包裝器 它處理記錄到文件(如果應用程序崩潰)和標準調試日誌記錄。 我想單元測試使用JUnit的類。Android - 如何使用mockito UnitTest記錄類

我曾嘗試以下,但它似乎沒有看完的例子後,產生我所期望的結果:

LogManager.class(這是我使用的類的簡化版本,用於演示目的)

public class LogManager implements ILogManager 
{ 
    public void log(String tag, String message) 
    { 
      Log.e(tag, message); 
    } 
} 

這裏是我的測試類

@RunWith(RobolectricGradleTestRunner.class) 
@Config(constants = BuildConfig.class, sdk = 21) 
@PrepareForTest({Log.class, LogManager.class}) 
public class LogManagerUnitTest 
{ 

    @Test 
    public void testLogConsoleInfo() 
    { 
     PowerMockito.mockStatic(Log.class); 

     LogManager.getInstance().log(LogLevel.INFO, "test", "test"); 

     PowerMockito.verifyStatic(Mockito.times(1)); 
     Log.e(anyString(), anyString()); 
    } 
} 

我的問題是,這傳遞不管我放。 例如:如果我用Log.wtf(...)替換上次調用,它仍然通過。我會假設它會失敗,因爲Log.wtf沒有在靜態類Log中調用? 所以我的問題是,爲什麼這種方法不能按預期工作,那麼正確的方法是什麼?

回答

6

我開始一個新項目,並能夠得到它的失敗測試並用下面的成功適當,所以我假設runwith是罪魁禍首:

@RunWith(PowerMockRunner.class) 
@PrepareForTest(android.util.Log.class) 
public class LoggerUnitTest { 
    @Test 
    public void testLog() throws Exception 
    { 
     PowerMockito.mockStatic(Log.class); //  when(Log.e(anyString(), anyString())).thenReturn(1); 

     Logger.log("test", "test"); 

     PowerMockito.verifyStatic(times(1)); 
     Log.e(anyString(), anyString()); 
    } } 
+0

我得到一個錯誤:'java.lang.NoClassDefFoundError:組織/的Mockito/CGLIB /代理/ Enhancer' –

0

對於RobolectricGradleTestRunner,下面的咒語會暴露您的日誌記錄: ShadowLog.stream = System.out Robolectric默認情況下不打印Android系統日誌記錄。

另外值得一提的是,RobolectricGradleTestRunner已贊成fully operational RobolectricTestRunner的被棄用(以上分配仍然有效)