如何检查代码库中是不是有任何方法调用

Posted

技术标签:

【中文标题】如何检查代码库中是不是有任何方法调用【英文标题】:How to check if there are any invocations of a method in the code base如何检查代码库中是否有任何方法调用 【发布时间】:2013-11-26 01:07:39 【问题描述】:

假设我有一个类Foo 和一个方法evilMethod

class Foo 

    public void evilMethod() 
       // do sth
    

有没有办法编写一个测试,只要在类路径上的任何类中调用此方法就会失败?我的意思是,不是在运行时调用该方法,而是在代码中声明它时。

例如,在类路径中的任何类中存在此代码都会导致测试失败:

if(false) 
    Foo f = new Foo();
    f.evilMethod(); // test fails because of that

我想要实现的目标:我想注释不应该在某个项目中调用的方法,但需要放置在那里以便在另一个项目中使用,然后编写一个测试以确保不会在任何地方调用注释的方法确实。

【问题讨论】:

反射方法意味着运行时解决方案,这是您明确排除的。我理解这一点的方式是,您正在寻找一个静态代码分析器来查找带注释的方法的调用。对吗? 是的,你是对的。但是您可以使用反射获得基于注释或任何其他标准的所有方法或类,所以我想也许您可以对方法调用做类似的事情。 您希望在编译期间还是在运行测试时进行此分析? 运行测试时我在想。 这有帮助吗? ***.com/questions/930289/… 【参考方案1】:

尽管您要求不要在运行时对其进行测试(除非您只是在生产中进行测试),但我个人还是希望将检查作为单元测试的一部分。使用 Mockito 它看起来像这样:

verify(mockFoo, never()).evilMethod();

根据答案:

https://***.com/a/12863072/575766

如果您的项目代码覆盖率很好,那应该可以为您解决问题。

【讨论】:

这是个好主意,但我希望有更多开箱即用的解决方案,例如:编写一个测试,涵盖所有添加此注释的方法,然后忘记它。 我认为您会为开箱即用的解决方案而苦恼 - 我项目中的类被禁止调用的方法要么是私有的/受保护的等,要么根本不存在。【参考方案2】:

我不知道它是否能解决您的问题,但FindBugs 对 Java 项目进行了静态代码分析。也许您可以在那里定义一个涵盖您的问题的规则...

【讨论】:

谢谢!我们已经使用了 FindBugs,所以这将是一个很好的解决方案(与我在这里实际要求的不同,但可能更好)

以上是关于如何检查代码库中是不是有任何方法调用的主要内容,如果未能解决你的问题,请参考以下文章

如何测试 N 秒后是不是没有调用方法?

有没有办法检查我的应用程序是不是调用了 iOS 8 独有的任何方法?

如何检查对象是不是具有某些方法/属性?

如何从不同appdomain的类库中调用实例方法?

调用非虚拟基方法时,C++ 中的虚拟继承是不是有任何惩罚/成本?

如何在不使用 Angular 的 spyOn 的情况下检查服务中的方法是不是在 Jasmine 单元测试中被调用?