[英]How to inject method into java tested class?
如何在不扩展测试类的情况下将方法(使用反射)注入超类? 我需要替换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());
}
}
简单的答案是,您不能不做一些真正奇怪的事情,这会导致您没有测试被测类,而是测试了类的一些奇怪的模拟版本。 您需要进行任何必要的设置,以使getExternalData
返回适当的值。 就是说,应该以这样一种方式编写class A
,即可以注入一个mock
以提供此外部external data
而不会触及外部资源。
为什么使用
super.getExternalData()
而不仅仅是
getExternalData()
这将使您扩展B并覆盖getExternalData()
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;
}
}
这对你有帮助吗?
(对我的英语感到抱歉)
嗨Marcin,
我在4月11日10:55回答了您,但是,在上了junit课程之后,如果您还没有解决,我有更好的解决方案:
首先,按照惯例,必须使用后缀“ Test”(在您的情况下为BTest)将TestClass称为SUT(被测对象)。
其次,在JUnit中常常使用Mock类来更改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代码规则! 如果可行,请投票给我,谢谢
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.