首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对构造函数的模拟,该构造函数使用java中的Powermockito提供基类引用。

对构造函数的模拟,该构造函数使用java中的Powermockito提供基类引用。
EN

Stack Overflow用户
提问于 2016-12-15 17:07:46
回答 1查看 1.1K关注 0票数 1

下面是这样的场景,在我的类MyClass的方法中有这样的东西

代码语言:javascript
复制
public class MyClass{

    public Object build(Map map) {

        BaseClass cls;     

        if(SomeconditionTrue) {

         cls = new ChildClass1(new ABC());

        } else {

        cls = new ChildClass2(new ABC());

       }

       cls.callMethod();

    }

}

对于上面的场景,我正在使用PowerMockito编写一个测试用例,我想模拟这个方法调用,cls.callMethod()。当我试图模拟时,它会调用失败的实际方法callMethod()。有人能帮我模拟一下那个方法调用吗?尝试使用几种使用PowerMockito PowerMockito.stub和其他一些选项的场景,但是它总是调用实际的方法。模拟这个方法的原因是,它在一起有一个不同的逻辑,并且调用不同的API,这个方法非常复杂,因此我们需要模拟这个方法。

EN

回答 1

Stack Overflow用户

发布于 2016-12-15 17:16:15

您可以求助于Power运动会,但这并不一定是解决此类问题的“最佳”答案。

本质上,在代码中调用新代码这一事实给您带来了悲伤--您由此创建了难以测试的代码。你可以看这些视频来理解我在说什么。

长话短说:与其求助于大型Powermock锤子,您还可以重新编写代码;使用依赖注入。因此,被测试的类可以使用一些工厂对象来提供它所需要的对象,而不是创建这些对象本身。然后您可以使用任何“普通”的模拟框架(如EasyMock或Mockito )来创建该工厂的模拟版本。

编辑:我想你可能把整件事弄得太复杂了。你看,有一个基类或者两个子类并不重要。问题是:对于每一种测试方法,您都应该准确地了解将采用哪条路径。您可以是希望创建一个child1,也可以是想要一个子的。因此,我为您创建了一个简化的解决方案:

代码语言:javascript
复制
package ghostcat.test;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

class Abc {}

abstract class Base {
  void callMethod() {
    System.out.println("Base::callMethod");
  }
}

class ChildClass1 extends Base {
  ChildClass1(Abc abc) {}
}

class MyClass {
  public Object build() {
    System.out.println("build1");
    Base cls = new ChildClass1(new Abc());
    System.out.println("build2");
    cls.callMethod();
    System.out.println("build3");
    return null;
  } 
}

@RunWith(PowerMockRunner.class)
@PrepareForTest(MyClass.class)
public class MockNewTest {
  @Test
  public void test() throws Exception {
    ChildClass1 mock = Mockito.mock(ChildClass1.class);
PowerMockito.whenNew(ChildClass1.class).withArguments(Mockito.any(Abc.class)).thenReturn(mock);
    new MyClass().build();
}

}

指纹:

代码语言:javascript
复制
build1
build2
build3

所以你可以看到-基中没有任何东西被调用;仅仅是因为那个子对象是“完全”模拟的。

关键是:您所测试的代码只需要一个特定类型的对象;而且您事先知道是child1还是child2。因此,您只需为该类创建一个模拟;然后使用PowerMockito来返回您刚刚创建的模拟。

为了记录:我和间谍玩了一段时间,但他们在这里帮不了什么忙,而且他们也不需要!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41169684

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档