Java 如何模拟子类函数调用的抽象类的超函数

Java 如何模拟子类函数调用的抽象类的超函数,java,unit-testing,powermock,Java,Unit Testing,Powermock,我正在为一个从抽象类扩展而来的类编写一个单元测试,子类的一个函数将调用super void函数和function //two classes in different package public abstract class AbstractBo { private Map myMap = new HashMap(); protected void load(String jsonString) { //convert the jsonString param

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

//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");
    }
}

我只想测试submit函数,模拟load和getItem函数。我是powermock的新手。

根据经验,您应该尽量避免使用powermock,因为它通常与糟糕的代码设计相关。 实际上,在本例中不需要使用它,因为Mockito在本例中使用了,正如文档中所述,这本身就是一种糟糕的代码味道

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

尽管如此,如果您仍在使用代码,只需将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);
  }
}

再次提醒您,这不是正确的方法,重构是可取的。

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

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

尽管如此,如果您仍在使用代码,只需将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);
  }
}

请注意,这不是正确的方法,重构是可取的。

你应该认真考虑改变你的代码,而不是寻找PosiMoCK来处理你的难测试设计。例如,您应该认真考虑更改代码,而不是查看PosiMoCK以围绕您的难测试设计进行工作。例如,见。