2017-04-21 20 views
0

私はBraintree PaymentsのJava API(執筆時点ではバージョン2.71.0)に基づいて支払いゲートウェイを作成しています。Braintree Java APIの周りに意味のある単体テストを書く方法を教えてください。

私はBraintreeに送信するリクエストに正しいパラメータが設定されていることを確認するための単体テストを作成したいと思います。しかし、Java APIによって公開されるオブジェクトは書き込み専用であるようです。

Braintreeサンドボックスの利用可能性に応じて私の自動テストを行うことは望ましくないことに注意してください。フレークなシステムテストではなく、堅牢な単体テストを作成したいと思います。完璧な世界では

、私は(MockitoとAssertJを使用して)このような何かを書くことができるようにしたいと思います:

BraintreeGateway mockGateway = Mockito.mock(BraintreeGateway.class); 
TransactionGateway transactionGateway = Mockito.mock(TransactionGateway.class); 
Result<Transaction> mockResult = (Result<Transaction>) Mockito.mock(Result.class); 

BigDecimal totalAmount = BigDecimal.valueOf(1234, 2); 
String customerId = "some-customer-id"; 

Mockito.when(mockGateway.transaction()).thenReturn(transactionGateway); 
Mockito.when(transactionGateway.sale(any())).thenReturn(mockResult); 

underTest.performTransaction(totalAmount, customerId); 

ArgumentCaptor<TransactionRequest> reqCaptor = ArgumentCaptor.forClass(TransactionRequest.class); 
Mockito.verify(transactionGateway).sale(reqCaptor.capture()); 

TransactionRequest sentRequest = reqCaptor.getValue(); 
Assertions.assertThat(sentRequest.getAmount()).isEqualTo(totalAmount); 
Assertions.assertThat(sentRequest.getCustomer().getId()).isEqualTo(customerId); 

ああ、私はsentRequestに乗るだけの方法がセッターです。

回避策として、私はBraintree APIによって送信されたHTTPリクエストをより深く捉えようと試みることができますが、それはほとんど読めなくなり、(もう一度)非常に薄れてしまうでしょう。

もっと良いアイデアですか?

答えて

0

Braintree APIを別のインターフェイスにラップし、期待動作をテストするためのAPIの統合テストを作成します。あなたは統合テストを実行し、バックエンドが変更されたとき(API、テクノロジ、バージョンの点で)、導入後にスモークテストを実行し、ユニットテストで新しいインターフェイスをモックすることができます。あなたは決して定義することはできません - ユニットテストサードパーティシステム。

あなたのテストは実際に何とか実際にテストされます(アンダーテストは何ですか)?それはあなたの嘲笑と引数のキャプチャをテストするだけです。

...そして、何かがほとんど読み取り可能であるならば、それは通常作家のせいです:P

+0

は私のポイントを作ってくれてありがとう:私たちは残りのモックやスタブを提供することができるため、BTのAPI周りのラッパーを書きましたシステムのしかし、私は最後のマイル(少なくとも私たちの側)を目指しています:我々がBTに渡すものが、生産に一度期待される行動を与えるものであることをテストします。 – Mithfindel

+0

ええと、私はそれに答えたと思います。インターフェイスの背後にAPIをラップしているので、実際の実装でインターフェイスをテストできます。そのインターフェースはあなたが使用するすべての機能を提供するので、そのテストケースを持ち、対応するバックエンドを使ってどこでも実行することができます...上記のように、テストケースを出荷/ビルドチェーンのどこにでも置くことができます。テストデプロイメントの前に...または何が欠けていますか? – slowy

関連する問題