1

两个类:

class A{
  public int getValue(){
    return 5;
  }
}

class B{
  public int getValue(){
    A a = new A();
    return a.getValue();
  }
}

现在我想为B 类编写一个测试,但我想为该测试模拟A 类。问题是:如何?

(这个片段只是我的问题的一个更简单的版本,请不要小心返回 5 或 smth)

4

3 回答 3

3

可能有一些棘手的方法可以做到这一点,但简而言之,你的写作B方式不利于嘲笑。不要在 B 中实例化 A,而是尝试将 A 注入 B

考虑将其更改为

class B {
  private A a;
  public void setA(A a) {
    this.a=a;
  }
  public int getValue(){
    return a.getValue();
  }
}

你甚至可以a通过初始化private A a = new A(),但是提供一个 setter 允许你注入一个 mock 进行测试。


编辑:如果在重写 B 以使其对单元测试友好时遇到困难,您仍然可以使用将进行字节码操作的模拟框架,如 Powermock。这是实现您想要的示例:

http://code.google.com/p/powermock/wiki/MockConstructor

于 2013-09-10T09:59:28.693 回答
1

模拟可以使用instance variable并具有setter相同的功能。

以下两个链接可能会帮助您了解您正在尝试做的上述事情

使用 Mockito、EasyMock 等进行 JUnit 模拟 如何在 java 中模拟局部变量?

于 2013-09-10T10:07:54.540 回答
0

模拟类用于获取测试其他类功能所需的数据。在这种情况下,A 类没有使用模拟类,因为它只返回 5。但是如果它是 A 类内部的业务逻辑,则应该使用模拟类。创建一个新类并在原始类中添加相同的方法名称,并且不做任何逻辑只是从那里返回一些值。

于 2013-09-10T10:05:37.147 回答