【问题标题】:How to mock super function of abstract class which is called by a function of sub class如何模拟由子类的函数调用的抽象类的超级函数
【发布时间】:2019-09-15 00:00:16
【问题描述】:

我正在为从抽象类扩展的类编写单元测试,子类的一个函数将调用 super void 函数和函数。

//two classes in different package

public abstract class AbstractBo {
    private Map myMap = new HashMap();
    protected void load(String jsonString) {
        //convert the jsonString parameter to map, and set to myMap
    }
    public String getItem(String key) {
        return myMap(Key);
    }
}

public class SubBo extends AbstractBo {
    public String submit(String initString) {
        //init a map by super function
       this.load(initString);
       return this.getItem("myName");
    }
}

我只是想测试提交功能,模拟加载和 getItem 功能。我是 powermock 的新手。

【问题讨论】:

标签: java unit-testing powermock


【解决方案1】:

根据经验,您应该尽量避免使用 Powermock,因为它通常与糟糕的代码设计有关。 在这种情况下,您实际上不需要使用它,因为 Mockito 使用 spies 覆盖了这种情况,如文档中所述,这本身就是一种不好的代码气味。

我的建议是使用组合而不是继承来更改代码。

不过,如果您仍然坚持使用代码,只需将 Junit 和 Mockito 添加到您的依赖项中并编写如下测试:

import static org.junit.Assert.assertEquals;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.junit.MockitoJUnitRunner;

@RunWith(MockitoJUnitRunner.class)
public class SubBoTest {

  @Test
  public void shouldBehaveAsExpected() {
    final String expected = "expected String";
    final String testString = "test string";

    final SubBo bo = spy(SubBo.class);
    doNothing().when(bo).load(eq(testString));
    when(bo.getItem("myName")).thenReturn(expected);

    final String actual = bo.submit(testString);

    assertEquals(expected, actual);
  }
}

再次提醒,这不是正确的做法,建议进行重构。

【讨论】:

    猜你喜欢
    • 2020-12-05
    • 2020-08-25
    • 2012-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    相关资源
    最近更新 更多