JUnit - 测试方法中使用的模拟类

时间:2013-09-10 09:51:44

标签: java junit

两个类:

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

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

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

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

3 个答案:

答案 0 :(得分: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可以让您注入模拟进行测试。


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

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

答案 1 :(得分:1)

可以使用instance variable进行模拟,同时使用setter

以下两个链接可能会帮助您完成上述尝试

JUnit mocking with Mockito, EasyMock, etc How to mock local variables in java?

答案 2 :(得分:0)

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