我如何模拟我正在测试的类的继承方法

时间:2016-10-25 17:55:38

标签: java junit mocking mockito powermock

我的代码与此相似

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调用,还有很多其他逻辑。我想嘲笑它们,以便可以对这部分进行单元测试然后单元测试后面的超级方法

3 个答案:

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