我试图监视一个对象,我想在构造函数调用它之前,将构造函数调用一个方法.
我的班级看起来像:
我的班级看起来像:
public class MyClass { public MyClass() { setup(); } public void setup() { } }
不能调用安装方法.那么,我如何侦测这个方法(和存根设置,使它什么都不做)?
它工作正常,嘲笑的方法,但我想单位测试MyClass,所以我将需要非常其他的方法.
为什么需要stub安装方法使其不起作用的原因:
我正在编写一个乐高机器人(lejos),并且在机器人需要工作的地方放置了一些代码.但是,当我将其称为TinyVM(安装在机器人上的VM)时,由于VM未正确初始化(因为测试在我的PC上运行),所以java崩溃.对于单元测试,设置并不重要.
我不能存储类/方法设置调用,因为它们中的一些是公共静态最终变量.
解决方法
要直接回答您的问题,您不能使用Mockito来存储从构造函数调用的方法.在开始嘲笑之前,Mockito需要一个类的实例,而您没有给自己创建一个测试实例的方法.
更一般地说,如Effective Java项17,you should not call overridable methods from constructors中所述.如果这样做,例如,您可以在引用最终字段的子类中提供一个覆盖,但在最后一个字段设置之前运行.这可能不会让你在这里遇到麻烦,但它在Java中是一个坏习惯.
幸运的是,您可以轻松地重组代码:
public class MyClass { public MyClass() { this(true); } /** For testing. */ MyClass(boolean runSetup) { if (runSetup) { setup(); } } /* ... */ }
为了使其更加明显,您可以使单参数MyClass构造函数为private,并提供一个公共静态工厂方法:
/* ... */ public static MyClass createForTesting() { return new MyClass(false); } private MyClass(boolean runSetup) { /* ... */
虽然一些开发人员认为在主要用于测试的方法中编写任何代码是一个不好的做法,但请记住,您负责代码的设计,测试是绝对知道您将需要适应的少数消费者之一.尽管在“生产”代码中避免显式测试设置仍然是一个好主意,但是为了测试,创建额外的方法或重载通常会使您的代码整体更清晰,并可以大大提高测试覆盖率和可读性.