Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.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 API方法的调用_Java_Unit Testing_Sorting - Fatal编程技术网

从源代码检测对Java API方法的调用

从源代码检测对Java API方法的调用,java,unit-testing,sorting,Java,Unit Testing,Sorting,假设我想为一个方法或类编写一个单元测试,以确保该方法的源代码不调用某个JavaAPI方法(在本例中为Arrays.sort)。这可能吗?我之所以想这样做,是因为我想进行自动测试,检测是否从特定类的特定方法中的任何位置调用了数组。sort,在这种情况下,我希望相关测试失败。不幸的是,基于文本的方法完全不能令人满意,因为它也会引起关注 例如,对Arrays.sort的潜在引用可以从源代码注释中进行排序。非常感谢您的帮助。您可以通过创建排序界面和使用Arrays.sort的实现来实现 public i

假设我想为一个方法或类编写一个单元测试,以确保该方法的源代码不调用某个JavaAPI方法(在本例中为
Arrays.sort
)。这可能吗?我之所以想这样做,是因为我想进行自动测试,检测是否从特定类的特定方法中的任何位置调用了
数组。sort
,在这种情况下,我希望相关测试失败。不幸的是,基于文本的方法完全不能令人满意,因为它也会引起关注
例如,对Arrays.sort的潜在引用可以从源代码注释中进行排序。非常感谢您的帮助。

您可以通过创建排序界面和使用Arrays.sort的实现来实现

public interface SortUtil {}

public class SortUtilImpl implements SortUtil { 
  public void sort(Collection c) {
    Arrays.sort(c);
  }
}
现在,您必须使用“客户端”类中的接口进行排序。对于单元测试,将实际实现替换为测试模拟实现。比如:

public SortUtilMock implements SortUtil {
  public void sort( Collection c) {
    StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
    //... here you check if the sort is called by a forbidden method
  }
}
致以最良好的祝愿,
Zied

这当然是可能的,但可能并不容易。您可能能够连接到Eclipse编译器并观察它的AST或其他数据结构。可能-我可能会使用Javassist遍历类的字节码并查找调用该方法的任何指令-但是为什么?!?