PowerMockito:如何模拟构造函数调用的方法



我有以下类:

public class Foo {
  public Foo() {
     initField1();
     initField2();
     initField3();
  }
}

我需要改变行为(模仿)initField1()initField3(),因为他们什么都不做或他们实际做的其他事情。我对执行initField2()的实际代码感兴趣。

我想写下面的测试:
Foo foo = new Foo();
assertTrue(foo.myGet());

myGet()返回一个由initField2()计算的Foo的属性。

initField()方法当然是私有的。

我怎么能做这样的事?

感谢您的帮助,并致以最诚挚的问候。

考虑到遗留代码中可能发生任何事情:)您可以使用PowerMock来抑制http://code.google.com/p/powermock/wiki/SuppressUnwantedBehavior

中描述的方法。
import static org.powermock.api.support.membermodification.MemberMatcher.methods;
import static org.powermock.api.support.membermodification.MemberModifier.suppress;
@RunWith(PowerMockRunner.class)
@PrepareForTest(Foo.class)
public class FooTest {
    @Test
    public void testSuppressMethod() throws Exception {
        suppress(methods(Foo.class, "initField1", "initField3"));
        Foo foo = new Foo();
    }
}

尽管如此,您应该在获得足够的测试覆盖率之后对类进行重构。

我认为你想做的事情有问题。

据我所知,像Mockito或PowerMock这样的模拟框架是为了模拟被测试对象与其依赖项之间的交互。

我理解你的问题,你想模拟对象行为的一部分,并测试它的其余部分。

在你的例子中,你想测试一些永远不会发生的事情,因为如果不调用initField1()initField3(), initField2()将永远不会被调用

如果您不想调用initField1()initField3的原因是因为这些方法与其他对象、文件系统或DB交互,那么您应该通过构造函数参数或带注释的setter注入依赖项,并为您的测试注入mock。要实例化正确设置了依赖关系的对象,可以使用工厂模式、构建器模式,或者更好的方法是使用依赖注入框架,比如Spring或Google Guice。

如果你不想调用initField1()initField3的原因是因为它们在你的对象中处理不同的业务逻辑,那么这听起来(如http://martinfowler.com/books/refactoring.html)就像你打破了单一职责原则,你应该重构

相关内容

  • 没有找到相关文章

最新更新