3

CDI を使用しているときに、テスト中にどのモック実装を使用する必要があるかを指定する方法を知りたいです。

@Alternative でモック実装をマークできることはわかっていますが、beans.xml で定義する必要があります。複数のモックが必要です(複数のオブジェクト用)。OrderService と EmailService があるとします。EmailService にメールを送信させたくない受け入れテストを書いています。次に、システム テストであるもう 1 つのテスト セット - メールを送信したいが、実際の順序は作成しないでください。

理想的な解決策は、次のように、テスト メソッドの呼び出しごとに Alternatives を指定することです。

@BeforeMethod
public void before(){
  // in this test suite we're using mock email service
  addAlternative(MockEmailService.class);
}
@Test
public void testMyStuff(){
  issueAnOrder(); // and verify that it worked. no emails sent!
}

出来ますか?

4

4 に答える 4

2

CDI-Unit には、モックのサポートが組み込まれていますhttp://jglue.org/cdi-unit/ テスト クラスでプロデューサー フィールドとしてモックを指定するだけです。

class Starship {

  @Inject
  Engine engine; //This will be mocked

  void start() {
    engine.start();
  }
}


@RunWith(CdiRunner.class)
class TestStarship {

  @Inject
  Starship starship;

  @Produces
  @Mock // Mockito will create a mock for us.
  Engine engine;

  @Test
  public void testStart() {
    starship.start();

    // Verify that the mocks start method is called at least once.
    Mockito.verify(engine, Mockito.atLeastOnce()).start();
  }
}
于 2013-03-06T10:42:50.293 に答える
1

@Alternative/@Specialisation と Arquillian の組み合わせが必要だと思います。Arquillianは統合テストの新しい可能性を提供し、「beans.xml」を変更することで、各テストに異なる代替を指定できるようにします。具体的な詳細については、この質問を参照してください。

于 2012-11-29T12:53:44.647 に答える
0

ローランドはおそらく最も受け入れられる答えです。別の可能な方法は、テストまたは環境で設定したプロパティと、不要なバージョンの ProcessAnnotatedType.veto() を読み取るポータブル拡張機能を作成することです。

Arquillian のもう 1 つのオプションは、すべての代替手段をバンドルせず、複数のデプロイメントを選択することです。

于 2012-11-29T15:05:06.633 に答える