Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 测试调用静态包装器方法的类_Java_Android_Testing_Junit_Mockito - Fatal编程技术网

Java 测试调用静态包装器方法的类

Java 测试调用静态包装器方法的类,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

我有一个android
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);
    }
}