Java 如何模拟子类函数调用的抽象类的超函数
我正在为一个从抽象类扩展而来的类编写一个单元测试,子类的一个函数将调用super void函数和functionJava 如何模拟子类函数调用的抽象类的超函数,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
//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以围绕您的难测试设计进行工作。例如,见。