当前位置: 首页 > 知识库问答 >
问题:

无法使用Mockito引发异常

闻深
2023-03-14

当方法运行时,我希望抛出一个异常(在测试时)。我能做的事情很少:

  1. 存根(mock.someMethod(“某些参数”)).ToThrow(new RuntimeException());
  2. 当(mock.someMethod(“某些参数”)).thenThrow(new RuntimeException())
  3. 放弃.....

通常我会创建一个spy对象来调用spied方法。使用stubbing我可以抛出一个异常。在日志中始终监视此异常。更重要的是,测试不会崩溃,因为抛出异常的方法可以捕获它并返回特定的值。但是,在代码中,不抛出异常(日志中没有监视任何东西&&返回值为true,但应该为false)。

问题:在本例中,不抛出异常:

    DeviceInfoHolder deviceInfoHolder = new DeviceInfoHolder();

    /*Create Dummy*/

    DeviceInfoHolder mockDeviceInfoHolder = mock (DeviceInfoHolder.class);

    DeviceInfoHolderPopulator deviceInfoHolderPopulator  = new DeviceInfoHolderPopulator(); 

    /*Set Dummy */
    deviceInfoHolderPopulator.html" target="_blank">setDeviceInfoHolder(mockDeviceInfoHolder);

    /*Create spy */
    DeviceInfoHolderPopulator spyDeviceInfoHolderPopulator = spy(deviceInfoHolderPopulator);

    /*Just exception*/
    IllegalArgumentException toThrow = new IllegalArgumentException();

    /*Stubbing here*/
    stub(spyDeviceInfoHolderPopulator.populateDeviceInfoHolder()).toThrow(toThrow);

    /*!!!!!!Should be thrown an exception but it is not!!!!!!*/
    boolean returned = spyDeviceInfoHolderPopulator.populateDeviceInfoHolder();
    Log.v(tag,"Returned : "+returned);

共有3个答案

陆晓博
2023-03-14

间谍对象的创建在这里是不好的。

创作应该像

DeviceInfoHolderPopulator spyDeviceInfoHolderPopulator = spy(new DeviceInfoHolderPopulator());

然后将您的方法存根到spy对象上。

参考:API

编辑:

这是API的。

Sometimes it's impossible or impractical to use Mockito.when(Object) for stubbing spies. 
Therefore for spies it is recommended to always 
use doReturn|Answer|Throw()|CallRealMethod family of methods for stubbing. 
Example:

List list = new LinkedList();
List spy = spy(list);

//Impossible: real method is called so spy.get(0) throws IndexOutOfBoundsException (the list is yet empty)
when(spy.get(0)).thenReturn("foo");

//You have to use doReturn() for stubbing
doReturn("foo").when(spy).get(0);
狄兴邦
2023-03-14

Spy的语法略有不同:

doThrow(toThrow).when(spyDeviceInfoHolderPopulator).populateDeviceInfoHolder();

更多内容请参阅“重要的情报信息”一节!此处:https://mockito.googlecode.com/svn/tags/latest/javadoc/org/mockito/mockito.html#13

池麒
2023-03-14

创建新答案,因为SpyDeviceInfoHolderPopulator.PopulateDeviceInfoHolder();是你的测试方法。

单元测试的一个基本规则是,您不应该停止测试方法,因为您想测试它的行为。您可能希望使用mockito来存根测试类的假依赖项的方法。

因此,在这种情况下,您可能希望删除间谍,调用您的测试方法,并且作为测试的最后一个阶段(当前缺少),您应该验证测试方法中的逻辑是否正确。

编辑:

在最后一条评论之后,我终于明白了你在测试什么逻辑。假设您的测试对象依赖于某个XMLReader。另外,这个阅读器有一个名为“readXML()”的方法,用于从XML读取的测试逻辑中。我的测试如下所示:

XmlReader xmlReader = mock (XmlReader.class);
mock(xmlReader.readXml()).doThrow(new IllegalArgumentException());

DeviceInfoHolderPopulator deviceInfoHolderPopulator  = new DeviceInfoHolderPopulator(xmlReader); 

//call testing method
boolean returned = spyDeviceInfoHolderPopulator.populateDeviceInfoHolder();

Assign.assignFalse(returned);
 类似资料:
  • 我正在使用Mockito来模拟服务层的方法。 试图嘲笑以下代码行 为了嘲笑我正在使用的这个 但问题是当代码到达行

  • 我有一个返回类型为的方法。它还可以抛出许多异常,所以我想测试一下那些被抛出的异常。所有尝试都失败了,原因相同: 类型Stubber中的(T)不适用于参数(void)时的方法 有什么想法,我可以如何获得方法抛出一个指定的异常?

  • 我正在使用Mockit。我遇到过这样的情况:一个方法抛出一个异常,捕捉该异常并记录该异常(并且不重新抛出)。 现在,对于某些场景,xyz()可以引发异常,该异常在abc()中捕获。我要测试的就是这个场景。我无法使用,因为正在捕获并记录异常。然而,我的测试用例应该看看是否引发了这个异常。 我确实在网上搜索过,但是没有找到任何相关的东西。 任何关于如何接近的指针都会很有帮助。 我提到这个问题,看起来很

  • 问题内容: 我有一个带有返回类型的方法。它还可以引发许多异常,因此我想测试所引发的异常。所有尝试均以相同的原因失败: Stubber类型中的when(T)方法不适用于参数(void) 有什么想法可以获取引发指定异常的方法吗? 问题答案: 括号放置不正确。 您需要使用: 而 不是 使用: 在文档中对此进行了解释

  • 我有一个非常令人沮丧的NServiceBus问题,我似乎无法解决。我希望你们能对局势有所了解。 我目前正在使用NServiceBus。核心版本5。0和N服务总线。主机v6。0并以不引人注目的模式运行它。 看来,无论我使用什么配置,我总是得到某种错误。我将从产生最少问题的配置开始: 案例1-使用自定义组件扫描: 我注意到的问题如下: > 当启动NServiceBus主机应用程序并且数据库暂留SQL还

  • 单元测试以空指针异常退出。SafeFile rootRepoDir的值为null,我不知道为什么。我嘲笑过它,那为什么它显示为null?如果我删除这一行,powerMockito.whennew(Safefile.class).withanyArguments().thenreturn(file1);则rootRepoDir的值为非空 我在PrepareForTest中添加了sc.class,使用