2

我正在尝试测试一段代码,

它是这样的:

class Foo {
    //do some operations
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            //some piece of code
        }
    }
}

那么我如何在运行函数中测试代码。我正在使用powermock,

线程是在另一个类中启动的,所以我不应该在那里调用它吗?

我还是个初学者。

4

3 回答 3

0

Runnable 的 run() 方法中的代码将在 Event Dispatch Thread 上调用。通常只应在此线程上执行 GUI 更新。使用模拟对象来测试 GUI 不是一个好主意。

于 2012-10-12T07:04:50.917 回答
0

取决于您要测试的内容。

如果您正在测试Foo- 的行为,请不要担心并发性。只需拨打电话Foo并断言获得的结果符合您的期望。就够org.junit.Assert了。

如果您正在测试这Runnable实际上会做什么,您需要首先打破依赖关系。现在你的类Foo依赖于 some Runnable,它在内部被实例化和调用。将其转换为 的参数Foo

class Foo {
  private Runnable runnable;
  public Foo(Runnable rnbl) {
    this.runnable = rnbl;
  }
  // somewhere later in the class
  SwingUtilities.invokeLater(this.runnable);
}

现在您可以使用Mockito模拟这个 Runnable并进行测试(在您的单元测试中):

Runnable mock = Mockito.mock(Runnable.class);
Foo foo = new Foo(mock);
foo.doSomething();
Mockito.verify(mock).run(); // verify that it was called

这就是您如何将多线程应用程序转换为仅用于测试的单线程。

于 2012-10-12T09:46:44.830 回答
0

据我了解,主要问题是异步。在我们从 invokeLater() 块中获取结果之前,测试会检查结果。所以我们需要等到 EDT 运行我们的代码,然后再进行检查。我们可以通过带有空可运行块的 invokeAndWait 方法来做到这一点。示例 Foo 类:

import javax.swing.SwingUtilities;

public class Foo {

    private String myLine;

    public void executeInEDT(final String line) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                myLine = line;
            }
        });
    }

    public String getLine() {
        return myLine;
    }
}

和测试方法:

@Test
public void testInvokeLater() throws InterruptedException, InvocationTargetException {
    String testLine = "Test line";
    Foo foo = new Foo();
    foo.executeInEDT(testLine);
    SwingUtilities.invokeAndWait(new Runnable() {
        @Override
        public void run() {
            // Just for sync
        }
    });
    assertEquals(testLine, foo.getLine());
    // And more asserts
}

UPD :在Netbeans 测试模式中找到了更多信息:

由于runnables的队列是先进先出的,runnable被调度在应用程序发布的所有任务之后,当它最终执行时,可以确定AWT事件队列中应用程序的所有延迟任务也都结束了。有关在应用程序代码完成发布到 AWT 事件线程的某些操作时需要等待的测试示例,请参阅 DataEditorSupportTest.java。

于 2016-09-21T13:52:21.830 回答