Java:修改和访问在构造函数中初始化的变量

标签 java constructor scope variable-assignment

我有课。
我在该类的构造函数中初始化一个变量。
我调用一个包含 while 循环的方法,并在每次循环时递增变量。
我编写了一个测试来检查调用该方法后变量的值(并执行一次 while 循环)。

public class ThreadGenerator implements Runnable {
  private int requests;
  private int limit;

  public ThreadGenerator() {
    requests = 0;
  }

  public void setRequestLimit(int anyLimit) {
    this.limit = anyLimit;
  }

  public void generateThread() {
    new Thread(this).start();
  }

  public void run() {
      while(requests < limit) {
          try {
              // do some stuff
              requests++;
              // close some stuff
          } catch (IOException e) {
            e.printStackTrace();
          }
      }
  }

  public int getRequests() {
      return requests; // calling this method from my tests always returns 0
  }

在我的测试中,当我创建此类的新实例,然后在该类上调用此方法时,它会正确运行并正确增加请求计数器。我已经尝试了几种打印语句来确保这一点。但是,如果我在测试中对 ThreadGenerator 对象调用 getRequests,它将返回 0,即它初始化时使用的数量。

我的测试代码:

ThreadGenerator threadGenerator = new ThreadGenerator();
threadGenerator.setRequestLimit(1);
threadGenerator.generateThread();
assertEquals(threadGenerator.getRequests(), 1);

如何修改在构造函数中初始化的变量并在测试套件中访问它?

最佳答案

请记住,仅仅因为您要求 Java 使用 Runnable 创建一个新线程,并不意味着将立即调用 run() 方法。很可能 assertEquals 发生在 run 第一次发生之前。

您可能想要返回线程并调用 join在生成的线程上进行测试,这将确保线程运行直到它死亡,可能会有很短的超时。

/* in the system under test */
@VisibleForTesting Thread generateAndReturnThread() {
  Thread thread = new Thread(this);
  thread.start();
  return thread;
}

public void generateThread() {
  generateAndReturnThread();
}

/* in the test */
@Test public void yourTest() {
  ThreadGenerator threadGenerator = new ThreadGenerator();
  threadGenerator.setRequestLimit(1);

  // wait up to a second for thread to complete
  threadGenerator.generateThreadAndReturn().join(1000);

  assertEquals(threadGenerator.getRequests(), 1);
}

旁注:考虑 AtomicInteger对于您的请求类,如果多个线程可能会修改请求。这将有助于防止两个不同的线程同时修改请求并相互覆盖。

关于Java:修改和访问在构造函数中初始化的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14251729/

相关文章:

java - Java中有秒表吗?

java - 使用 BufferedReader 读取 CSV 文件导致读取替代行

c - 如何在机器级别或内存级别的编译器中实现变量的范围

python - 如何获取工厂函数的参数

java - Play 框架无法将 #{set} 标签分配的变量读取到 #i{if} 标签中?

java - 如果类方法/字段只能由类本身访问,它们的封装是否重要?

java - 在 java 中从 hotmail gmail yahoo 获取联系人列表?

php - 类构造函数

reactjs - 使用 find 与 includes 有什么区别?

constructor - 辅助 kotlin 构造函数变量是如何传入的?