Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用mockito嘲弄twilio_Java_Oop_Unit Testing_Mockito_Twilio - Fatal编程技术网

Java 用mockito嘲弄twilio

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

我正在为一个方法编写一个单元测试,如果在我的twilio帐户上已经找到了一个子帐户,该方法将返回true。我试图用Mockito来模拟这一点,但将cast errors casting List转换为AccountList。我查看了mockito文档,但可能遗漏了一些内容

这就是测试:

        @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()
…是的,我做了这些,这给了我投射问题。嘲弄是这里的出路吗?谢谢你的帮助,真的。