Java 测试调用静态包装器方法的类
我有一个androidJava 测试调用静态包装器方法的类,java,android,testing,junit,mockito,Java,Android,Testing,Junit,Mockito,我有一个androidLog的静态包装器类 它看起来像这样(简化): 我的问题是:我正在测试另一个调用LogUtil.v()的方法 如果可能的话,有没有办法用Mockito而不是Powermock(ito)来测试其他方法 目前它抛出一个LogUtil.v not mock异常 我读到如果我必须使用PowerMockito,我就做错了(>没有遵循TDD)。(免责声明:我是那些告诉人们不要使用PowerMock(ito)的人之一) 话虽如此:当您使用无法更改的第三方库时,使用PowerMock(it
Log
的静态包装器类
它看起来像这样(简化):
我的问题是:我正在测试另一个调用LogUtil.v()的方法
如果可能的话,有没有办法用Mockito而不是Powermock(ito)来测试其他方法
目前它抛出一个LogUtil.v not mock
异常
我读到如果我必须使用PowerMockito,我就做错了(>没有遵循TDD)。(免责声明:我是那些告诉人们不要使用PowerMock(ito)的人之一)
话虽如此:当您使用无法更改的第三方库时,使用PowerMock(ito)是一个合理的选择
实际上,您只有两个选择:
- 如前所述;选择允许模仿静态方法的框架;这允许您防止在单元测试环境中执行此类静态init代码。有PowerMock(ito),还有
- 或者,您可以围绕这些类构建一个小型包装器;然后确保all您自己的代码只适用于那些包装器李>
实际上,为了用自己的包装器替换这些静态调用而对整个代码库进行大规模重构并不是一件轻松的事情。我认为Mock背后的基本思想(在他们添加“helper”函数之前)是Mock代表您创建对象。对于静态方法,您不需要对象,因此不需要模拟。只需使用LogUtil.getTag()并验证它是否返回有效数据。但这只是我的观点,所以也许有人会有更好的答案。也许我在这里是无知的,但你在测试其他方法时到底有什么问题?这个方法在这里调用你的方法是如何阻止你测试它的?@FlorianSchaetz这样的静态init块总是带有一定的风险。根据具体的内容,已经加载带有此类init的类可能会使您崩溃。这就是为什么static名声不好的原因之一:如果使用不当,您可能会使其他人的单元测试比它应该做的要困难得多。相信我,我知道静态的问题是什么,但问题是,在这个例子中,实际的问题是什么,因为我没有看到任何代码会真正破坏测试,但也许我只是不知道。可能是
Log.v(getTag(),message)代码>。。。但是@FlorianSchaetz你说得有道理……谢谢你冗长的回复!我目前确实在重构我的代码以使其可测试(TDD:D),并且我正在尝试理解基本知识。它看起来像是将unitTests.returnDefaultValues=true
添加到构建中。gradle修复了它,我的静态包装器不是问题所在。
// Source: https://github.com/ccrama/Slide/blob/master/app/src/main/java/me/ccrama/redditslide/util/LogUtil.java
public class LogUtil {
private static final int CALLING_METHOD_INDEX;
static {
int i = 1;
for (StackTraceElement ste : Thread.currentThread().getStackTrace()) {
i++;
if (ste.getClassName().equals(LogUtil.class.getName())) {
break;
}
}
CALLING_METHOD_INDEX = i;
}
public static String getTag() {
final StackTraceElement ste = Thread.currentThread().getStackTrace()[CALLING_METHOD_INDEX];
return "(" + ste.getFileName() + ":" + ste.getLineNumber() + ")";
}
public static void v(String message) {
Log.v(getTag(), message);
}
}