java - 如何模拟未作为参数传递的对象

标签 java testing mocking mockito

想象一下下面的类

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://static.springsource.org/spring/docs/2.5.x/api/org/springframework/test/util/ReflectionTestUtils.html#setField%28java.lang.Object,%20java.lang.String,%20java.lang.Object%29

如果不直接使用反射编写自己的代码,请在此处获取一些信息:

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/

相关文章:

android - Robotium 测试失败,出现 : junit. framework.AssertionFailedError : View can not be clicked!

TDD 和模拟

java - Apache 如何与 PHP 通信

java - 如何找到n选择r而不溢出

java - AXIS2 和 JAX-WS 如何更改 SSL 握手?

java - Respond.getRequestDispatcher() 不起作用

python - 如何测试 LT 代码的实现?

unit-testing - IO返回值测试

android - 这是在 android 中设置模拟位置的最佳应用程序

java - 每次使用 PowerMock 进行测试后模拟行为都会重置