【问题标题】:JUnit & EasyMockJUnit & EasyMock
【发布时间】:2014-12-17 00:14:12
【问题描述】:

是否可以模拟在我正在单元测试的类中实例化的类?

class ClassToTest {
    public String methodToTest(object a, object b, object c) {
        //Do Lots of cool stuff here
        SomeOtherClass someOtherClass = new SomeOtherClass();
        someOtherClass.doMoreCoolStuff(a, b, c, this);
        //Do even more cool stuff to "this" as it was updated by someOtherClass
}

我想模拟将用于 int ClassToTest 的 SomeOtherClass。我正在使用 EasyMock,但我似乎无法编译它。有任何想法吗?我要解决这个问题了吗?想法?

【问题讨论】:

  • 我不认为你可以模拟这个类,除非你使用非常晦涩的 Java 黑魔法。按照设计,你应该避免实例化这样的类,而是应该关联类,这样它们的耦合度就会降低。当您移动到关联时,您就可以模拟周围的对象。在您的情况下,您可以将实例化的类和方法调用视为方法中的私有调用,然后您不会对其进行模拟,而只是将其作为 methodToTest 测试的一部分进行测试。

标签: junit4 easymock


【解决方案1】:

你需要一些方法来把模拟放到那里。这都是测试的一部分。当你找到这样的东西,并且说“我无法测试”时,你需要重构代码以便进行测试。正是这种重构,才会慢慢将诡异诡异的设计变成美丽的艺术。 (太深了?)

例如:

interface Factory {
    public SomeOtherClass create();
}

class ClassToTest {
    Factory factory;
    public void setFactory( Factory factory ) { this.factory = factory }

    public String methodToTest(object a, object b, object c) {
        //Do Lots of cool stuff here
        SomeOtherClass someOtherClass = factory.create();
        someOtherClass.doMoreCoolStuff(a, b, c, this);
        //Do even more cool stuff to "this" as it was updated by someOtherClass
}

测试应该是这样的:

public void test() {
    SomeOtherClass mock = EasyMock.create( SomeOtherClass.class );
    Factory factory = EasyMock.create( Factory.class );

    ClassToTest test = new ClassToTest();
    test.setFactory( factory );

    expect(factory.create()).andReturn(mock);

    // can now test mock interaction

    replay(mock,factory);
    test.methodToTest(a,b,c);
    verify(mock,factory);

}

有很多方法可以做到这一点。关键是使您的代码可测试。有很多次我发现自己需要为我编写的某个类提供一个方法,结果却发现它已经存在,因为我需要它来进行测试。

【讨论】:

    【解决方案2】:

    您可以使用 Powermock 来做到这一点。

    SomeOtherClass soc=EasyMock.createNiceMock(SomeOtherClass.java);
    Powermock.expectNew(SomeOtherClass.java).andReturn(soc).anyTimes();
    

    expectNew() 期望在特定类上调用 'new' 并返回我们想要返回的对象,在我们的例子中,它必须是一个模拟对象,以便每当在特定类上调用 new 时注入模拟。

    希望这会有所帮助!

    祝你好运!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多