Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.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 如何使用easymock模拟构造函数上的方法调用?_Java_Constructor_Easymock - Fatal编程技术网

Java 如何使用easymock模拟构造函数上的方法调用?

Java 如何使用easymock模拟构造函数上的方法调用?,java,constructor,easymock,Java,Constructor,Easymock,我有一个类,它接收一个工厂作为参数,该参数在构造函数内部调用。必须在那里调用它,因为对象在使用之前应该完全初始化。比如: class MyClass { private Foo foo; MyClass(FooFactory fooFactory, Bar bar) { this.foo = fooFactory.newFoo(bar); } } 无法将FO实例直接传递给构造函数,因此考虑这是对问题的限制。无法使用EasyMock测试MyClass,因为fooFacto

我有一个类,它接收一个工厂作为参数,该参数在构造函数内部调用。必须在那里调用它,因为对象在使用之前应该完全初始化。比如:

class MyClass {

  private Foo foo;

  MyClass(FooFactory fooFactory, Bar bar) {
    this.foo = fooFactory.newFoo(bar);
  }
}

无法将FO实例直接传递给构造函数,因此考虑这是对问题的限制。无法使用EasyMock测试MyClass,因为fooFactory将是未在安装程序中初始化的模拟:

private MyClass myClass;

  public void setUp() {
     FooFactory fooFactory = mock(fooFactory);
     Bar bar = new Bar();
     myClass = new MyClass(fooFactory, bar)
  }
因此,当调用setUp时,构造函数内部对
fooFactory.newFoo(bar)
的调用将失败,并出现IllegalStateException,因为没有设置此类期望


问题是,如何在构造函数中模拟方法调用?

在创建
MyClass
之后,您可以在
设置中
EasyMock.reset(fooFactory)

为什么不能在setUp()方法中设置fooFactory的期望值?因为构造函数将在replay()之前调用fooFactory.newFoo(bar)将调用它并抛出异常。如果您在安装程序中调用replay(),则无法在其他测试中模拟任何其他内容。可能我不明白您的意思,但这不起作用。这里的问题不是重置mock,而是在调用replay()之前让它工作。我想他说的是,您可以重放mock,调用构造函数,然后重置mock以使用它,就像您没有调用replay一样。关于重置的文档不是很清楚。@peninha它对我有用<代码>重置
将模拟状态返回到创建后的状态。您将记录
fooFactory.newFoo()
回放它,调用
MyClass
构造函数,
验证
重置
的行为,使其可用于实际测试方法。