【问题标题】:How to mock abstract method of an abstract class?如何模拟抽象类的抽象方法?
【发布时间】:2019-10-11 19:03:45
【问题描述】:

我有一个下面的方法,我使用这条线ProcBOF.getInstance().find 来获取一些数据。

  private static Map<Long, Long> getAll(Map<Long, Event> holder) throws FinderException {
    Map<Long, Long> map = new HashMap<>();
    if (holder.isEmpty()) {
      return map;
    }
    Set<Long> items = holder.keySet();
    long[] itemIds = Longs.toArray(items);
    List<TeraBo> teraBos = TBOF.getInstance().findItemIdsIn(itemIds);
    for (TeraBo tBo : teraBos) {
      ProcessBo bo = ProcBOF.getInstance().find(tBo, holder.get(tBo.getItem().getId()).getDataId(), ReadSet.FULL, null);
      bo.getVar();
      map.put(tBo.getItem().getId(), bo.getVar());
    }
    return map;
  }

现在我想模拟ProcBOF 类的find 方法,以便它可以返回一些虚拟的ProcessBo 对象,我们可以从中调用getVar() 方法,但问题是ProcBOF 是一个抽象类,并且find 是一个抽象方法,所以我无法理解如何模拟这个抽象类的抽象方法。

public interface ProcessBo extends BOI {
    //...
}

public abstract class ProcBOF extends BaseBof {
    //...
    public abstract ProcessBo find(TeraBo saleBo, long dataId, ReadSet readSet, Filter filter) throws FinderException;
}

【问题讨论】:

  • 重构您的代码以消除隐藏的依赖关系,这样会更容易使用和测试。

标签: java jmockit


【解决方案1】:

你的实现有点奇怪,所以我不确定我是否能够正确地重现它(抽象类上的 getInstance() 方法很奇怪)。

但是,我认为这样的事情应该可以工作:

import mockit.Expectations;
import mockit.Mocked;
import mockit.Tested;
import mockit.integration.junit4.JMockit;
import org.junit.runner.RunWith;

import java.util.HashMap;
import java.util.Map;

import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;

@RunWith(JMockit.class)
public class Test {

    // Constants -----------------------------------------------------

    // Attributes ----------------------------------------------------

    /**Tested class*/
    @Tested
    private Foo foo;

    /**Mocked so that all instances are a mock*/
    @Mocked
    private ProcBOF procBOF;

    /**Mocked so that all instances are a mock*/
    @Mocked
    private ProcessBo processBo;

    // Constructors --------------------------------------------------

    // Static --------------------------------------------------------

    // Public --------------------------------------------------------

    @org.junit.Test
    public void name() throws Exception {
        // GIVEN
        new Expectations() {{
            // we mock the getInstance method and return always the mocked instance
            ProcBOF.getInstance();
            result = procBOF;

            // we mock the find method and return the mocked process Bo
            procBOF.find((TeraBo) any, 2L, ReadSet.FULL, null);
            result = processBo;

            // we also mock the getVar method
            processBo.getVar();
            result = "foo";
        }};

        // test data
        Map<Long, Event> map = new HashMap<>();
        map.put(1L, new Event());

        // WHEN
        // call the getAll method
        Map<Long, Object> ret = foo.getAll(map);

        // THEN
        // we get the mocked value
        assertThat(ret.get(1L), is("foo"));
    }

    // Package protected ---------------------------------------------

    // Protected -----------------------------------------------------

    // Private -------------------------------------------------------

    // Inner classes -------------------------------------------------

}

【讨论】:

    猜你喜欢
    • 2016-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多