Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.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 用powermock测试构造函数_Java_Junit_Powermock - Fatal编程技术网

Java 用powermock测试构造函数

Java 用powermock测试构造函数,java,junit,powermock,Java,Junit,Powermock,有人知道powermock中有什么方法可以对构造函数进行单元测试并模拟构造函数调用的方法吗 i、 我有一节这样的课 public class myClass { public myClass(){ myMethod(); // do other stuff } public void myMethod(){ // do stuff } } 我想做的是为模拟myMethod()的myClass()构造函数编写一个单元

有人知道powermock中有什么方法可以对构造函数进行单元测试并模拟构造函数调用的方法吗

i、 我有一节这样的课

public class myClass {
    public myClass(){
        myMethod();
        // do other stuff
    }
    public void myMethod(){
        // do stuff
    }
}
我想做的是为模拟
myMethod()
myClass()
构造函数编写一个单元测试

如果
myMethod()
是静态的,这将很容易,因为我可以使用
mockStaticPartial()
然后调用构造函数

仅仅创建MyClass的部分模拟也不会起作用,因为一旦我创建了模拟,我就创建了它,此时调用构造函数只会创建MyClass的一个新实例,而不会模拟
myMethod()


有人知道任何方法吗?

你不应该模仿被测试的类。如果构造函数调用一个方法,那么该方法的操作应该作为测试构造函数的一部分进行测试。如果该方法所做的事情超出了单元测试的范围,那么就模拟该方法用来做“事情”的类


如果您真的想使用上面的方法(我不建议这样做),您可以创建一个子类来覆盖该方法。(这与johncarl在上面的精彩评论背道而驰)。

您一定是在项目后期启动了TDD……顺便说一句,从构造函数中调用公共非final方法是一种不好的形式。将方法设为私有或最终。好吧,假设我确实将从构造函数调用的方法设为私有,我仍然想模拟它。我的示例只是一段快速编写的代码,用来说明我正在尝试做的事情——使用powermockWith powermock模拟从构造函数调用的方法部分模拟被测类是完全合理的,这实际上是powermock的主要优点之一。创建子类和重写方法实际上是powermock在创建部分模拟时所做的,这仍然给我留下了问题中描述的问题。您面临的问题是模拟框架创建包装代理。但是,一旦进入模拟实例,当它调用自己的一个方法时,它不会退出并重新进入类a,从而通过代理。因此,即使使用Mockito的spy机制(允许存根实例方法),这也不会起作用,因为要存根的方法是从被监视的实例中调用的。我重申了子类和重写解决方案。嗯,我想我希望powermock的类加载器能够在创建对象之前模拟构造函数中的方法调用。也许你是对的,我自己过度使用这种方法是唯一的出路。假设这是在power mock中无法完成的事情,谢谢您的帮助!:-)