Android - 如何使用 mockito 对日志 class 进行单元测试
Android - How to UnitTest a Logging class with mockito
我写了一个 class 来管理 android 应用程序项目中的日志记录。
LogManager 基本上是 android.util.log 的包装器
如果应用程序崩溃,它会处理记录到文件中,以及标准调试日志记录。
我想使用 JUnit 对 class 进行单元测试。
我尝试了以下方法,但在阅读示例后似乎没有产生我期望的结果:
LogManager.class(这是我用过的class的简化版,用于演示)
public class LogManager implements ILogManager
{
public void log(String tag, String message)
{
Log.e(tag, message);
}
}
这是我的测试class
@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 没有在静态 class 日志中调用?
所以我的问题是,为什么这种方法没有按预期工作,正确的方法是什么?
我开始了一个新项目,并且能够通过以下方法让它通过测试并适当地成功,所以我假设 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());
} }
对于 RobolectricGradleTestRunner,以下咒语会暴露您的日志记录:
ShadowLog.stream = System.out
Robolectric 默认不打印 Android 系统日志。
还值得注意的是,RobolectricGradleTestRunner 已被弃用,取而代之的是 fully operational RobolectricTestRunner(上述分配仍然有效)
我写了一个 class 来管理 android 应用程序项目中的日志记录。 LogManager 基本上是 android.util.log 的包装器 如果应用程序崩溃,它会处理记录到文件中,以及标准调试日志记录。 我想使用 JUnit 对 class 进行单元测试。
我尝试了以下方法,但在阅读示例后似乎没有产生我期望的结果:
LogManager.class(这是我用过的class的简化版,用于演示)
public class LogManager implements ILogManager
{
public void log(String tag, String message)
{
Log.e(tag, message);
}
}
这是我的测试class
@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 没有在静态 class 日志中调用? 所以我的问题是,为什么这种方法没有按预期工作,正确的方法是什么?
我开始了一个新项目,并且能够通过以下方法让它通过测试并适当地成功,所以我假设 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());
} }
对于 RobolectricGradleTestRunner,以下咒语会暴露您的日志记录:
ShadowLog.stream = System.out
Robolectric 默认不打印 Android 系统日志。
还值得注意的是,RobolectricGradleTestRunner 已被弃用,取而代之的是 fully operational RobolectricTestRunner(上述分配仍然有效)