如何将方法注入java测试类?

时间:2012-04-11 10:48:02

标签: java unit-testing reflection junit

如何在没有扩展测试类的情况下将方法(使用反射)注入超类? 我需要替换 getExternalData()来测试someMethod()内的逻辑。我无法改变测试类 - 因为我正在考虑注入方法。

我有流动的课程:

public class B extends A{
  public String someMethod(){
    String someString = super.getExternalData();
    //logic to be tested - manipulating on someString
    return someString;
  }
}

public class A{
  public String getExternalData(){
    //some Logic that generates "externalData" string
    return externalData;
  }
}

并测试:

public class CesTest{
  @Test
  public void someMethodTest()(
    B instance = new B();
    //...
    //...
    assertEquals("expectedData", instance.someMethod());
  }
}

4 个答案:

答案 0 :(得分:1)

简单的答案是你不能不做一些非常奇怪的事情,这会导致你没有测试被测试的类,而是一些被测试的类的奇怪的模拟版本。您需要执行任何必要的设置才能使getExternalData返回适当的值。话虽如此,class A应该写成这样一种情况,即可以注入mock来提供此external data而无需点击外部资源。

答案 1 :(得分:0)

为什么要使用

super.getExternalData()

而不仅仅是

getExternalData()

这将允许您扩展B并覆盖getExternalData()

答案 2 :(得分:0)

public class B extends A{
  public String someMethod(){
    String someString = getExternalData(); //without 'super'
    //logic to be tested - manipulating on someString
    return someString;
  }
  @Override
  public String getExternalData(){
    //Overriding code
    return externalData;
  }
}

public class A{
  public String getExternalData(){
    //some Logic that generates "externalData" string
    return externalData;
  }
}
这对你有帮助吗?

答案 3 :(得分:0)

(关于我的英语)

嗨马辛,

我在4月11日10:55回答你,但是,在我接受了一个junit课程后,我有一个更好的解决方案,如果你还没有解决它:

Fisrt to All,TestClass必须被称为SUT(受测试对象),并且在您的情况下,按照惯例,BTest,按照惯例。

其次,在JUnit中经常使用Mock Classes来改变Collaborators方法(Collaborator是导致与SUT依赖的类)。更好的选择是使用Google Code的Mockito,一个免费且更好的jUnit API。使用:

public class BTest{
  @Test
  public void someMethod()(
    B instance = new B();
    when(instance.getExternalData()).thenReturn("expectedData");
    assertEquals("expectedData", instance.someMethod());
  }
}

http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html Google代码规则!如果有效,请投票给我答案,谢谢

相关问题