我正在编写一个基于Java API for Braintree Payments的支付网关(截至撰写时版本为2.71.0)。
我想编写单元测试来检查我发送给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 :(得分:-1)
我将Braintree API包装成一个单独的接口并编写API的集成测试,以测试预期的行为。这样就可以运行集成测试,当后端发生变化时(在API,技术和版本方面),您可以在部署后运行冒烟测试,并且可以在单元测试中模拟新界面。你不应该 - 实际上你不能按照定义 - 单元测试第三方系统。
你的测试究竟测试了什么(什么是测试不足)?它看起来只测试你的模拟和参数捕获。
......如果某些东西难以辨认,那通常是作家的错:P