日期:2014-05-20  浏览次数:20698 次

绕过java构造函数创建类实例,可行否
背景描述:
要测试下面MyClass类中的func函数,但是MyClass没有默认构造函数:
Java code

public class MyClass{
    private OtherClass obj;
    public MyClass(OtherClass obj){ //OtherClass的构造比较麻烦,而其obj这个对下面func的测试没有帮助
        this.obj = obj;
        ....
    }

    public void func(){  //要测试的函数
        ....
    }
}



由于上面的OtherClass的构造比较麻烦,而其obj这个对下面func的测试没有帮助,所以产生了绕过构造函数的想法;
具体已经有一种方法:通过反序列化的手段(具体比较复杂,有可能要涉及到对序列化文件进行修改的情况);这里想让大家出出主意,有没有更好的别的方法。


------解决方案--------------------
反序列化?不懂什么意思,帮顶吧
------解决方案--------------------
晕,每个类都有默认的构造函数,谁说MyClass没有?
------解决方案--------------------
如果这个类暂时用不到obj这个实例的话,自己写一个与obj初始化无关的构造方法不就行了?
------解决方案--------------------
探讨
晕,每个类都有默认的构造函数,谁说MyClass没有?

------解决方案--------------------
不想构造OtherClass,很简单啊
new MyClass(null) 不就可以了

------解决方案--------------------
我晕死。你不写构造函数不就行了。。。
------解决方案--------------------
需要这么麻烦吗?
如果func用不到obj,你直接传个null不就行了,当然,前提是你的MyClass构造函数不发生null异常
不知道LZ是怎么测试的?junit?
------解决方案--------------------
有方法吗,不清楚
关注中

------解决方案--------------------
探讨
晕,每个类都有默认的构造函数,谁说MyClass没有?

------解决方案--------------------
那就用 OtherClass 的子类做参数,前提OtherClass非final类
public SubOtherClass extends OtherClass{
public SubOtherClass(){} 

}
------解决方案--------------------
你必须要让你的MyClass正确实例化。如果你的MyClass都没有正确实例化,你对它的测试还有什么意义呢?所以,你不要试图绕过构造函数,而是让它正确执行。11楼的兄弟已经给你指明了,NullObject处理这里问题非常合适。
------解决方案--------------------
学习一下。。帮顶。。。。。转点分。。。
------解决方案--------------------
当你写了在MyClass类里面构造了
public MyClass(OtherClass obj){ 
this.obj = obj;
....
}
这个构造函数的时候
如果你在别的地方用MyClass myClass = new MyClass();来实例化
则你必须在MyClass类里面加上public MyClass(){ }这构造函数

------解决方案--------------------
不能这样做,应为Java语言本省就是依靠构造函数来产生实例的

这是标准.
------解决方案--------------------
Java code
public class MyClass4Test{

    public static void func(){  //要测试的函数
        //....
        //copy MyClass#func()
    }
}

------解决方案--------------------
学习学习
------解决方案--------------------
探讨
晕,每个类都有默认的构造函数,谁说MyClass没有?