2016-03-21 10 views
0

私はverticleをテストしようとしていますが、MongoDBを使っています(単体テストの過程で実際のDBアクションを実行しないようにしています)、私はクライアントをモックしようとしましたが、私はvertx.deployVerticle()を使用しています。私のモックは考慮されていません。私はそれを嘲笑しましたけれどもPowerMockitoでvert.xアプリケーションをモックする

@RunWith(VertxUnitRunner.class) 
@PrepareForTest({ MongoClient.class }) 
public class VerticleTest { 
    @Rule 
    public PowerMockRule rule = new PowerMockRule(); 
    private Vertx vertx; 
    private Integer port; 

    @Before 
    public void setUp(TestContext context) throws Exception { 
    vertx = Vertx.vertx(); 

    mockStatic(MongoClient.class); 

    MongoClient mongo = Mockito.mock(MongoClientImpl.class); 
    when(MongoClient.createShared(any(), any())).thenReturn(mongo); 

    ServerSocket socket = new ServerSocket(0); 
    port = socket.getLocalPort(); 
    socket.close(); 

    DeploymentOptions options = new DeploymentOptions().setConfig(new JsonObject().put("http.port", port)); 
    vertx.deployVerticle(TalWebVerticle.class.getName(), options, context.asyncAssertSuccess()); 
    } 

そして、私が実際に見たもの、それは、MongoClient.createSharedがまだ呼び出されていることである。

は、ここに私のテスト・セットアップの例です。
この場合、私は何ができますか?問題はMongoClientがとPowerMockitoこの場合の静的メソッドを模擬することができないインターフェースであることであるよう

編集1
が見えます。
私はまだこのケースの回避策を見つけようとしています。

+1

「MongoClient」はインタフェースであり、静的メソッド(またはメソッド)がJava 8にのみ追加されている可能性があるためです.PowerMockはまだJava 8を完全にサポートしていません。あなたの問題は簡単に修正できます。 'MainMockTransformer'は、変更されているクラスがインタフェースであるかどうかをチェックし、メソッドをスキップします。以前のバージョンの回避策について考えています。次のリリースで修正するつもりです。 –

+0

うわー、素晴らしいニュース、@ArthurZagretdinov。私は 'JMockIt 'を試してみると、それは働くかもしれないと言っている人がいる。私達は見るでしょう... – WhiteAngel

答えて

1

私はMongoClientがインターフェイスであることを知らなかったので、最初の答えを出しました。

PowerMockは、静的呼び出しインターフェイスのモックをサポートしていません(バグ#510、Javaassistの固定例外ですが、静的メソッドをモックすることはまだサポートされていません)。次のリリースで呼び出されます。

私はPowerMockの問題に焦点を当てていましたが、なぜそれが必要なのではありません。私はMailing Listで提供された答えに同意します。

MongoClient.createdShared()を返す自分のコード のヘルパーメソッドを作成することで回避できます。次に、あなたのテストでは、 ヘルパーがあなたの嘲笑MongoClientImp

を返すようにすることをあざけりしかし、それはないの周りの仕事が、右の設計ソリューションとなります。モックMongoClientは、良いアプローチではないので、you should not mock types you don't ownです。

それでは、より良い方法は、あなたのためにMongoClientを作成し、これをユニットテストで助けてくれるカスタムヘルパーを作成することです。また、実際にMongoClient.createdShared()と呼ばれるこのヘルパーの統合テストが必要です。

コードを変更する機会がない場合(またはテストなしでコードを変更したくない場合)は、exampleを作成して、PowerMockのバグをバイパスする方法を回避できます。

主なアイデア:

  • は、カスタムMainMockTransformerを作成します。トランスフォーマーはインターフェースクラスを変換して、インターフェース用のモック静的呼び出しをサポートできるようにする
  • カスタムPowerMockRunnerを作成し、カスタムMockTransformerをトランスフォーマーチェーンに追加します。

これらの新しいクラスがあるパッケージ名に注意してください。それは重要です。それらを別のパッケージに移動したい場合は、これらの新しいパッケージを@PowerMockIgnoreに追加する必要があります。

+0

この混乱のため、申し訳ありません、それはちょうど私の最初のコードで少し壊れたコードです。 不要な部品を取り除くときに、誤って取り外しました。 'mockStatic(MongoClient.class) 'でも失敗します。ありがとう、私は私の最初のポストを更新します。 – WhiteAngel

+0

私は答えを変えました。 –

関連する問題