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_Junit_Junit4 - Fatal编程技术网

Java 调用存根而不是原始方法

Java 调用存根而不是原始方法,java,junit,junit4,Java,Junit,Junit4,我应该测试一个设计相当于以下内容的项目: public class A(){ public static void init() { M.m(); //some code } } public class M(){ public static void m() { //some code } } 我需要单独在class A()中测试方法init()。因此,我必须为M.M()制作一个与原始签名相同的模拟或存根。但不修改这两个类中的任何内容,因

我应该测试一个设计相当于以下内容的项目:

public class A(){
   public static void init() {
     M.m();
     //some code
   }
}
public class M(){
   public static void m() {
     //some code
   }
}

我需要单独在
class A()
中测试方法
init()
。因此,我必须为
M.M()
制作一个与原始签名相同的模拟或存根。但不修改这两个类中的任何内容,因为这是不允许的。在这两个方法都是静态的情况下,如何使
init()
调用存根并忽略原始方法?

静态方法不能在没有反射的情况下被存根或模拟,因为它们与类定义紧密绑定

如果您确实无法更改代码,请使用PowerMock,它提供了模拟静态方法的方法。
如果您可以更改代码,请将此方法设置为实例方法,并提供一种在
a
类中设置
M
依赖项的方法。

因此,您可以非常简单地存根
M.M()

如果依赖项未传递给调用方,则无法对其进行模拟或存根。请看@Zack Reda,这是一个很好的问题,但以前有人问过。你查过其他答案了吗?例如。最常见的建议是完全避免静态,因为它们很难测试:。@Jodiug感谢这些链接,是的,我已经检查了其中一些链接,但我不想使用任何模拟工具,我正在等待一个答案,解释当涉及到静态模拟时的反射functions@Zack如果我理解正确,您希望自己实现模拟逻辑。你能用这个要求更新这个问题吗?也许还有一个动机,就是为什么你不能使用现有的工具?