Android - 如何使用mockito UnitTest一个Logging类

beh*_*lit 3 junit android mockito powermock

我编写了一个类来管理android应用程序项目中的日志记录.LogManager基本上是android.util.log的包装器.它处理文件的记录,如果应用程序崩溃,则处理标准的调试日志.我想使用JUnit对类进行单元测试.

我已经尝试了以下但是它似乎没有产生我在阅读示例后所期望的结果:

LogManager.class(这是我用过的类的简化版本,用于演示目的)

public class LogManager implements ILogManager
{
     public void log(String tag, String message)
     {
           Log.e(tag, message);
     }
}
Run Code Online (Sandbox Code Playgroud)

这是我的测试课

@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());
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是无论我把它放在哪里都会通过.例如:如果我用Log.wtf(...)代替最后一次调用,它仍然会通过.我会假设它应该失败,因为Log.wtf没有在静态类Log中调用?所以我的问题是,为什么这种方法不能按预期工作,这样做的正确方法是什么?

beh*_*lit 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());
    } }
Run Code Online (Sandbox Code Playgroud)