3

コンストラクターで EJB へのローカル接続を実装したクラスのテストで問題に直面しています。この接続はコンストラクター内で使用され、インスタンス化されたクラスのいくつかのプライベート属性を設定します。

テストしたい MyClass :

public class MyClass {

  private String myValue;

  public MyClass() throws Exception {
    MyBeanLocal local = EJBFactory.getLocal(MyBeanLocal.class);
    myValue = local.fetchValue();
  }

  public void processValue() {
    ... do some String magic which should be tested ...
  }

  public String getValue() {
    return myValue;
  }

}

EJBFactory には拡張ルックアップ (キャッシング付き) が含まれており、ローカル接続またはリモート接続を返すことができます (リモートにはサーバーの場所が必要です)。

MyBeanLocal インターフェース

public interface MyLocalBean {
  public String fetchValue();
}

そして最後に、 MyClass.processValue メソッドをテストしたい私のjunitクラス:

public class MyClassTest {

  private MyClass myClass;

  @Before
  public void setUp() {
    myClass = new MyClass();
  }

  @Test
  public void testProcessValue() {
    Assert.assertEquals(myClass.processValue(), "MY EXPECTED VALUE");
  }

}

問題は、JUnits をローカル マシン (または Hudson や Jenkins などの自動テスト マシン) で実行し、ローカルとは異なるアプリケーション サーバー コンテキストで Bean を実行する場合の状況をテストする方法です。テストを書く必要があるだけで、本番コードに触れることはできません。

実際には MyBeanLocal を機能させる必要はありませんが、myValue を設定する必要があります。

あざけることを考えていましたが、私はそれに慣れていません。

4

2 に答える 2

1

このようなテストには、JMockit モック API (私が作成したもの) を使用できます。

public class MyClassTest
{
    @Tested MyClass myClass;

    @Test
    public void processValue() {
        new NonStrictExpectations() {
            @Mocked EJBFactory fac;
            @Mocked MyBeanLocal mb;

            {
                EJBFactory.getLocal(MyBeanLocal.class); result = mb;
                mb.fetchValue(); result = "SOME VALUE";
            }
        };

        assertEquals(myClass.processValue(), "MY EXPECTED VALUE");
    }
}

EJBFactory単体テスト環境でオブジェクトを返す場合、のモックは省略されることもあります。

于 2013-05-29T14:05:05.057 に答える
0

データベース接続を含むクラスをテストする場合、通常はモックが最適な方法です。オブジェクトのモックをより簡単にするフレームワークがいくつかありますが、そのうちの 1 つがMockitoです。

詳細については、こちらをご覧ください

また、Martin Fowler は、いつモックを使用するか、およびモックとスタブの違いについて、優れた記事を書きました。記事へのリンクはこちらです。

于 2013-05-21T06:51:35.577 に答える