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

标签 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)

最佳答案

可能有一些棘手的方法可以做到这一点,但简而言之,您编写 B 的方式不利于模拟。不要在 B 中实例化 A,而是尝试将 A 注入(inject) B

考虑改成

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

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


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

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

关于java - JUnit - 测试方法中使用的模拟类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18715717/

相关文章:

java - spring中如何子类并发控制,抛出什么异常?

带表达式的 Java 数组声明

java - 两个不同的 Activity 中有两个不同的 SwitchCompat

java - @NonNullByDefault 项目范围设置

java - 如何用 Java 编写 JUnit 测试,检查一个特定的打印,该打印依赖于循环中的用户输入

gradle - 在Gradle中,如何在每次执行JUnit测试类之前设置唯一的系统属性?

java - 自定义 Java 生产者中的 Kafka SSL 握手失败

java - 可以使用多少并发线程来对 Web 应用程序进行负载测试?

java - 如何验证给定类的特定构造函数是否被调用?

java - 使用 Eclipse 在 Java 中进行单元测试需要什么?