我试图修复一些现有的junit/mockito测试,因为重写使用Dao而不得不改变。Java&Mockito - 将一个参数传递给一个方法并捕获结果
所以我有这样的说法捕手: -
ArgumentCaptor<CustomerDao> customerDaoCaptor = ArgumentCaptor.forClass(CustomerDao.class);
,我已经用这种方法之前得到的(客户)对象,这样我可以对它进行更多的测试。我通常会使用这样的: -
verify(customerDao, times(1)).saveOrUpdate(customerDaoCaptor.capture());
,这样我就可以运行类似的测试: -
Customer customerActual = (Customer) customerDaoCaptor.getAllValues().get(0);
assertEquals("PRE", customerActual.getExistingCustomer());
然而,在这种情况下,我不调用saveOrUpdate方法(该捕获器绑定到),但另一个Dao方法将唯一键作为参数,最终通过使用sql更新客户记录 - 即它不使用父对象的(Hibernate)saveOrUpdate方法。
我知道我可以测试它的调用,如: -
inOrder.verify(customerDao, times(1)).updateRegisterStatusToCurrentByCustomerNumber(CUSTOMER_NUMBER);
所以我想以某种方式分配/捕捉体结合“updateRegisterStatus ....”的方法,但我不能似乎找到了一种方法来做到这一点,主要是因为该方法必须采用字符串参数customer_number。
因此,在本质我试图做到这一点: -
inOrder.verify(customerDao, times(1)).updateRegisterStatusToCurrentByCustomerNumber(CUSTOMER_NUMBER).customerDaoCaptor.capture()
这显然是行不通的......
由于很多谷歌搜索并没有帮助我,我猜测我完全错了。
更新 - @SpaceTrucker
我试过下面的代码如你所说: -
CapturingMatcher<String> capturingMatcher = new CapturingMatcher<String>();
verify(customerDao, times(1)).updateRegisterStatusToCurrentByCustomerNumber(
argThat(
org.hamcrest.Matchers.allOf(capturingMatcher, org.hamcrest.Matchers.notNullValue())
)
);
List<String> values = capturingMatcher.getAllValues();
根据我的DAO实现: -
public void updateRegisterStatusToCurrentByCustomerNumber(String customerNumber)
,它并通过测试成功,因为它不会失败,但它不会做我所需要的一切。这里的理想目标是以某种方式获取表示所更新的用户对象的对象 - 例如: -
Customer customerActual = (Customer) values.get(0);
assertEquals("value", customerActual.getExistingCustomer());
的值。然而对象为空和调试测试,我可以确认问题的方法被调用。
如果我在这里错过了一些微不足道的事情,并再次感谢您的帮助,请提前道歉!
不应该像'ArgumentCaptor customerCaptor = ArgumentCaptor.forClass(Customer.class)'一样定义捕获器;'?当获得捕获值时,这将为您节省铸件。 –
SpaceTrucker