【问题标题】:Mockito.doThrow().when .... Not working wellMockito.doThrow().when .... 效果不佳
【发布时间】:2017-09-15 10:12:22
【问题描述】:

我正在使用 JUnit 和 Mockito 进行一些单一测试。我想通过使用 Mockito.doThrow() 来处理异常,并且我已经在其他测试中使用了它,并且它以最好的方式工作。 现在我有:

Assigned newAssigned  = new Assigned();

      Mockito.doThrow(new SdkFault()).when(Api).addLicenseAssigned("2144", newAssigned  );

当我在调试时运行测试时发现这个

   Api.addLicenseAssinged(licenseId, newAssigned);

它应该得到异常并把它扔给我,对吗?还是我做错了什么? 而且我不是在嘲笑静态方法。

【问题讨论】:

  • 什么是Api,是类还是类实例? addLicenseAssigned 是静态方法吗?
  • @pvpkiran Api 是一个类,但我无法访问他,除非我取消编译代码,因为它是一个与服务器通信的 api。但我认为这甚至都没有关系,因为考虑到我们会自动说“当调用 xxxx 方法时返回异常 SdkFault()”,我们永远不会到达代码
  • 请修改您的问题。不要在 cmets 中在这里或那里放置信息。而是提供一个真正的minimal reproducible example within 你的问题。并遵循 java 命名约定。变量去camelCase。通过将对象命名为 Api 而不是 api,您正在创建一个您想要模拟 static 方法调用的对象 - 这在 Mockito 中是不可能的。

标签: exception junit mockito throw


【解决方案1】:

我认为您的问题是您正在使用的存根试图匹配您在测试中创建的对象,因此它与您在测试中的类中调用的对象不同,即:

Assigned newAssigned  = new Assigned();

要解决这个问题,您应该使用匹配器代替您的存根,即:

Mockito.doThrow(new SdkFault()).when(Api)
   .addLicenseAssigned(Matchers.eq("2144"), Matchers.any(Assigned.class));

【讨论】:

  • 我不是在嘲笑静态方法!我正在使用我看不到的 Api 代码,它只为我提供与服务器连接的方法。就像一个网络服务。这就是为什么我想知道为什么会发生这种情况。提前感谢您的宝贵时间,感谢您为我提供的所有帮助。
  • 我认为它是静态的,因为。 1. 它以大写字母开头,不应用于类实例。 2. 你说它是一个类而不是一个对象(即一个类实例)。你能显示你在哪里实例化 Api 的代码吗?
  • @Mock private LicenseApi licenseApi; Mockito.when(protexServer.getLicenseApi()).thenReturn(licenseApi);
  • 好的,最后一个问题。你能提供你实际调用被测类的代码,并且 newAssigned 传递给这个方法吗?
  • 我在创建测试类时正在调用被测调用,但我不明白你想要什么说“是 newAssigned 传递给这个方法”。谢谢你再一次时间。
猜你喜欢
  • 2018-01-20
  • 2018-06-07
  • 2012-02-26
  • 1970-01-01
  • 2014-02-09
  • 2016-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多