繁体   English   中英

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

[英]Java: Modify & access variable initialized in constructor

我有课
我在该类的构造函数中初始化一个变量。
我调用了一个包含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);
}

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

除了上述答案之外,请考虑将变量声明为volatile,以便在另一个线程对该变量进行递增之后,您实际上可以获取最新值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM