如何在没有扩展测试类的情况下将方法(使用反射)注入超类?
我需要替换 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());
}
}
答案 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代码规则!如果有效,请投票给我答案,谢谢