Java 用mockito嘲弄twilio
我正在为一个方法编写一个单元测试,如果在我的twilio帐户上已经找到了一个子帐户,该方法将返回true。我试图用Mockito来模拟这一点,但将cast errors casting List转换为AccountList。我查看了mockito文档,但可能遗漏了一些内容 这就是测试:Java 用mockito嘲弄twilio,java,oop,unit-testing,mockito,twilio,Java,Oop,Unit Testing,Mockito,Twilio,我正在为一个方法编写一个单元测试,如果在我的twilio帐户上已经找到了一个子帐户,该方法将返回true。我试图用Mockito来模拟这一点,但将cast errors casting List转换为AccountList。我查看了mockito文档,但可能遗漏了一些内容 这就是测试: @Mock TwilioRestClient client; @Mock AccountList accountList; @Mock Iterator<Account> iter
@Mock
TwilioRestClient client;
@Mock
AccountList accountList;
@Mock
Iterator<Account> iterator;
@Mock
Account account;
@Test
public void testShouldReturnTrueIfAccountNameFound() {
final List<Account> list = Arrays.asList(account);
when(client.getAccounts()).thenReturn((AccountList) list);
when(account.getFriendlyName()).thenReturn("test");
when(accountList.iterator()).thenReturn(list.iterator());
MyTwilioAccountStore store = null;
store = new MyTwilioAccountStore(client);
Assert.assertTrue(store.subAccountExists("test"));
}
@Mock
最坏的客户;
@嘲弄
会计清单;
@嘲弄
迭代器}
*
*@返回帐户列表。
*/
公共帐户列表getAccounts(){
返回此.getAccounts(新的HashMap());
}
我怎样才能正确地模拟帐户列表 编辑这里真正的问题似乎是能够模拟twilio客户端返回的
帐户列表
EDIT CONTINUED如果,正如我所怀疑的,这个类实现了Iterable
,那么需要的是用模拟帐户构建一个单元素列表,并让accountList.iterator()返回上面创建的列表的iterator
原始答案
你嘲笑:
when(accountList.iterator().next())
但是当您使用foreach循环时,首先调用的是.iterator()
本身——您没有针对它的mock。作为返回,mockito执行默认操作:返回null
(老实说,我真的很惊讶,它甚至没有在这里抛出一个异常,告诉我“对不起,不能这样做”,因为这是一个链接方法调用!)
你应该:
when(accountList.iterator()).thenReturn(anIterator);
其中,anIterator
是一个实际的迭代器,由.hasNext()
、.next()
和.remove()
组成
由于您似乎也想对您的帐户使用模拟,我想您的列表应该设置为:
final List<Account> accountList = Arrays.asList(account);
final List accountList=Arrays.asList(account);
其中:
@Test
public void shouldReturnTrueIfAccountNameFound()
{
final List<Account> list = Arrays.asList(account);
when(account.getFriendlyName()).thenReturn("test");
when(accountList.iterator()).thenReturn(list.iterator());
final MyTwilioAccountStore store = new MyTwilioAccountStore(client);
Assert.assertTrue(store.subAccountExists("test"));
}
@测试
public void应返回TrueIFaccountNameFound()
{
最终列表=Arrays.asList(account);
当(account.getFriendlyName())。然后返回(“测试”);
when(accountList.iterator()).thenReturn(list.iterator());
最终MyTwilioAccountStore=新的MyTwilioAccountStore(客户);
Assert.assertTrue(store.subAccountExists(“test”);
}
在我看来,你好像做错了。仅仅因为你在一个字段上说了@Mock
,并不意味着任何实例化相同类型的类的东西都会得到它。您需要找到一种方法让getRestClient()
返回模拟。如果它返回一个新的AccountList
,这将不是您的模拟,它可能会导致这些问题
向我们展示getRestClient()
方法,我可以提供更多帮助
好的,您有一个getAccounts()
方法,您正在用这一行模拟它:
when(client.getAccounts()).thenReturn((AccountList) list);
AccountList accounts = getRestClient().getAccounts(params);
但是被测试的系统调用这一行:
when(client.getAccounts()).thenReturn((AccountList) list);
AccountList accounts = getRestClient().getAccounts(params);
看到这里的区别了吗?被调用的实际方法采用映射
,但您并不是在模仿该方法。您需要将上面的when更改为以下内容:
when(client.getAccounts(any(Map.class))).thenReturn((AccountList) list);
换句话说,你在嘲笑错误的方法。默认情况下,Mockito将返回合理的默认值,在本例中,该值恰好为null
。如果getAccounts()
返回一个整数/int,它将返回0。你从哪里得到你的NPE?对不起,但是你必须澄清,在这个上下文中什么是NPE?客户端似乎在某处有一个.getAccounts(Map())
方法,对吗?此方法的访问修饰符是什么?您能否显示或至少提供到AccountList
原型的链接?当然,这里是AccountList的源代码,这里有点长。getRestClient只是变量client的一个getter,该变量client在构造函数中设置为注入的TwilioRestClient的值。@请编辑您的原始问题以向我们展示。我需要查看NullPointerException,我需要查看它发生在哪一行,我需要查看getAccounts()
如何工作。信息不足。已更新问题。在NPE发生的地方添加了一条注释,当帐户被迭代时。谢谢你helping@Phil那是个打字错误。如果导入静态org.mockito.mockito.*,请使用any(Map.class)
@Phil代码>你可以使用,嗯,我试试这个。我用我的try的最新版本编辑了我的问题。它仍然会产生NPE。如果可能的话,我会尝试这种方法。列表可能无法强制转换为AccountList。给我一点时间,不是这样的!从您的代码中,我看到AccountList
实现了Iterable
,对吗?尝试了您的方法,但仍然获得了NPE。奇怪的我更新了问题以反映问题的外观。好的,然后您需要使client
返回一个实际的列表,在.getAccounts()
…是的,我做了这些,这给了我投射问题。嘲弄是这里的出路吗?谢谢你的帮助,真的。