Java 如何使用JMockit模拟继承的方法
下面是我的代码,我正在为perform方法编写Junit测试用例。我希望方法getList返回虚拟值,因为DB不可用。请建议我如何使用JMockit做同样的事情Java 如何使用JMockit模拟继承的方法,java,junit,jmockit,Java,Junit,Jmockit,下面是我的代码,我正在为perform方法编写Junit测试用例。我希望方法getList返回虚拟值,因为DB不可用。请建议我如何使用JMockit做同样的事情 class BaseClass { public List<> getList() { return DataBase.getList(); } } class ChildClass extends BaseClass { public boolean perform(String
class BaseClass {
public List<> getList() {
return DataBase.getList();
}
}
class ChildClass extends BaseClass {
public boolean perform(String temp) {
boolean bool=true;
List list = getList();
for(String str:list){
if(str.equals(temp);
bool=false;
break;
}
return bool;
}
}
类基类{
公共列表getList(){
返回DataBase.getList();
}
}
类ChildClass扩展了基类{
公共布尔执行(字符串临时){
布尔布尔布尔=真;
List=getList();
for(字符串str:list){
如果(str)等于(temp);
布尔=假;
打破
}
返回布尔;
}
}
只要ChildClass
不覆盖BaseClass::getList()
您就必须模拟BaseClass::getList()
:
新模型(){
@嘲弄
List getList(){
返回新的ArrayList();//此处是您的模拟
}
}
应该模拟的不是基类#getList()
,而是数据库#getList()
:
公共类示例测试{
@被测儿童级切割;
@试验
public void findItemList(@Mocked DataBase db){
List=Arrays.asList(“Abc”、“test”、“def”);
新期望(){{DataBase.getList();result=list;}};
布尔itemNotFound=cut.perform(“test”);
assertFalse(itemNotFound);
}
}
模拟BaseClass#getList()
需要部分模拟,这可以通过newexpectations(cut){{cut.getList();result=list;}}
。但是部分模拟是一种已知的糟糕的测试实践,应该避免。我不再使用JMockit,转而使用Mockito。使用@Mock annotation可以解决上述问题。您可能是指@Spy
注释。但是JMockit测试更简单。@user1520277——如果您不再关心您的问题的话,并且您没有将任何答案标记为有用,您是否可以删除它而不是将其保留为未回答?
new MockUp<BaseClass>() {
@Mock
List<> getList() {
return new ArrayList(); // your mock here
}
}
public class ExampleTest {
@Tested ChildClass cut;
@Test
public void findItemInList(@Mocked DataBase db) {
List<String> list = Arrays.asList("Abc", "test", "def");
new Expectations() {{ DataBase.getList(); result = list; }};
boolean itemNotFound = cut.perform("test");
assertFalse(itemNotFound);
}
}