想象一下下面的类
public class ClassToBeTested{
private AnotherClass otherClass;
public void methodToBeTested(){
otherClass = new AnotherClass();
String temp = otherClass.someMethod()
// ...some other code that depends on temp
}
}
现在,如果 methodToBeTested
被设计为接受 AnotherClass
的实例,我可以轻松创建 AnotherClass
的模拟并告诉 Mockito 返回一个调用 someMethod()
时我更喜欢的值。然而,由于上面的代码是 AFAIK 设计的,因此不可能模拟 AnotherClass
并且测试此方法将取决于 someMethod()
返回的内容。
无论如何我可以测试上面的代码而不依赖于 someMethod()
使用 Mockito 或任何其他框架返回的内容吗?
最佳答案
如果可用,您可以使用 Spring ReflectionTestUtils
setField
方法:
如果不直接使用反射编写自己的代码,请在此处获取一些信息:
http://www.java2s.com/Code/Java/Reflection/Setprivatefieldvalue.htm
类似于下面的内容,您将需要额外的错误处理才能使其正常工作:
public void setField(Object obj, String fieldName, Object value) {
Field f = obj.getDeclaredField(fieldName);
f.setAccessible(true);
f.set(obj, value);
}
然后可以这样调用:
setField(objUnderTest, "fieldToSet", mockObject);
编辑
我刚刚注意到您正在方法中实例化它。如果这是绝对必要的,那么您应该遵循 cyroxx 发布的可能重复的链接。 虽然这种做法通常是糟糕设计的标志,所以如果你能把它去掉,我会的。
关于java - 如何模拟未作为参数传递的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15406769/