我的代码与此相似
class Util{
public String transform(String str);
//lots of logic including ajax calls
return("Modified"+str);
}
public caseChange(String str){
//lots of logic including ajax calls
return str.toUpperCase()
}
class TextParser extends Util{
public String parse(str)
//lots of logic to modify str
str = caseChange(str);
//some more logic to modify str
return transform(str);
}
无论如何都要模拟caseChange和转换方法来返回一些模拟数据并阻止在我调用时调用超类
String result = new TextParser().parse("hello")
在单元测试类中断言结果。
在我的示例中,transform和changeCase被简化了。实际上,他们执行ajax调用,还有很多其他逻辑。我想嘲笑它们,以便可以对这部分进行单元测试然后单元测试后面的超级方法
答案 0 :(得分:1)
在你给出的例子中:你根本就不这样做。您的方法仅处理您的输入;所以在实施这些方法时,它应该绝对不。
换句话说:您最好只关注合同检查测试。像:
@Test
public testWhatever() {
assertThat(new TextParser.parse("hello"), is("expected output"));
}
是的,你可能可能使用Mockito / Powermock嘲笑这些事情;但你不应该!你看,你的生产代码直接调用那些方法;所以你想要来测试调用 parse 会给你预期的结果(同时使用所有也会在生产设置中运行的代码!)
编辑:鉴于您对这些方法的评论“复杂”。然后我建议:不在这里使用继承。您应该不使B类成为A的子类,以便轻松访问某些方法。换句话说:继承是关于建模一个IS-A关系。那么, TextParser 是 Util ?听起来不太令人信服。
因此:你最好转到组合。您的 TextParser 应使用 Util 对象。那个可以通过依赖注入提供;并且你需要使用继承的方法进行模拟完全消失!
答案 1 :(得分:1)
您可能需要创建另一个子类,如
cannot change version of project facet dynamic web module to 3.0 one or more constrants have not been satisfied
编辑:使用mockito:
class TextParserForTest extends TextParser {
@Override
public String parse(String str) {
super.parse(str);
}
@Override
public String caseChange(String str) {
return "whatever";
}
}
答案 2 :(得分:0)
您可以使用Mockito的间谍功能。间谍称实际方法,除非它们被存在。
@Test
public void testParse() {
TextParser textParser = Mockito.spy(new TextParser());
when(textParser.caseChange(Matchers.anyString())).thenReturn("mocked");
Assert.assertEquals("Modifiedmocked", textParser.parse("hello"));
}