2

テストしようとしているコードがあります。

これは次のようになります。

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

では、実行関数内でコードをテストするにはどうすればよいですか。私はパワーモックを使用しています、

スレッドは別のクラスで開始されるので、そこで呼び出すべきではありませんか??

まだ初心者です。

4

3 に答える 3

0

Runnable の run() メソッドのコードは、イベント ディスパッチ スレッドで呼び出されます。通常、このスレッドでは GUI の更新のみを実行する必要があります。モック オブジェクトを使用して GUI をテストすることはお勧めできません。

于 2012-10-12T07:04:50.917 に答える
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 テストパターンでさらに情報が見つかりました:

ランナブルのキューは FIFO であるため、ランナブルはアプリケーションによってポストされたすべてのタスクの最後にスケジュールされ、最終的に実行されると、AWT イベント キュー内のアプリケーションの遅延タスクもすべて終了したことを確認できます。アプリケーション コードが AWT イベント スレッドにポストされたいくつかのアクションを完了するまで待機する必要があるテストの例については、DataEditorSupportTest.java を参照してください。

于 2016-09-21T13:52:21.830 に答える
0

何をテストしようとしているかによって異なります。

-の動作をテストしている場合はFoo、同時実行性について心配する必要はありません。を呼び出してFoo、得られた結果が期待どおりであることをアサートするだけです。だけorg.junit.Assertで十分でしょう。

これが実際に何をするかをテストしている場合は、最初に依存関係を壊すRunnable必要があります。これで、クラスはインスタンス化されて内部的に呼び出されるsome に依存します。の引数に変換します:FooRunnableFoo

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 に答える