【问题标题】:SecurityProvider in Mockito Tests when run alongside Robolectric与 Robolectric 一起运行时 Mockito 测试中的 SecurityProvider
【发布时间】:2017-04-06 14:28:35
【问题描述】:

我们有一个 Android 项目,我们在其中使用 MockitoTestRunner 和 RobolectricTestRunner 进行不同类型的测试。

我编写了一组与 SSL 相关的单元测试,因此加载了证书/密钥库/信任库等。为此,我使用了 MockitoJUnitRunner 并以编程方式添加了 Bouncycastle 提供程序:

Security.insertProviderAt(new BouncyCastleProvider(), 1);

现在,这些测试运行非常好 单独运行时 - 例如当我直接从测试类运行单个方法,或者从项目树菜单运行这些类时,它们工作得很好。

但是当我在 ANY 使用RobolectricTestRunner 的测试旁边运行上述测试时(例如,如果我只是在提交之前一起运行我项目中的所有测试) ,我得到以下异常:

java.io.IOException: error constructing MAC:
java.lang.SecurityException: JCE cannot authenticate the provider BC

我很困惑。在一个测试类中使用的 testrunner 将如何影响其他类的运行,尤其是如果我们使用不同的测试运行器?


附加信息:

  • 只有在我实际尝试对 BC 提供程序做某事时才会发生异常(例如,第一次测试尝试加载 PKCS12 证书时) - insertProviderAt(...) 调用本身似乎可以通过...
  • 此外,当我打印出每次测试运行的提供程序列表时,我看到 Robolectric 已经有一个 BC 提供程序,但当我尝试使用它时仍然失败。
  • 另外,如果我添加 BC 提供程序,当在测试套件中与 Robolectric 测试一起运行时,测试仍然会失败并出现相同的错误。当单独运行时,它们会因java.security.NoSuchProviderException: no such provider: BC 而失败,因为我们明确指定了提供程序。

【问题讨论】:

  • 您是否尝试删除tearDown 中的安全提供程序?
  • roboelctric 团队最近修复了 Mockito2 和 Roboelectric 之间的一些问题。您是否尝试将两者都更新到最新版本?
  • 你说的问题是关于 Mockito 实验功能你模拟最终类和方法
  • @EugenMartynov:不,提供者没有被删除。但是 Mockito 测试在 Robolectric 测试之后运行时失败,所以我认为 Mockito 测试中的 tearDown 现在没有任何影响。跨度>
  • 你能创建一个minimal reproducible example吗?

标签: android mockito bouncycastle robolectric


【解决方案1】:

看起来像 Robolectric is using its own classloader(有利于它在 Android API 上的替代品),这可能与 Mockito 的常规类加载器冲突。

因此,为了同时使用 Robolectric 和 mockito,您可以执行以下操作:

  1. 使用 Robolectric 跑步者。 Robolectric 使用自己的类加载器,有利于替代 Android API,因此它确实需要自己处理类加载。没有其他方法可以使用 Robolecric。

  2. 用这些覆盖 MockitoJUnitRunner 行为的替代方法替换 @RunWith(MockitoJUnitRunner.class):

    @Before public void setUpMockito() {
       MockitoAnnotations.initMocks(this);
     }
    
     @After public void tearDownMockito() {
       Mockito.validateMockitoUsage();
     }
    

也许这可能是同时使用 Robolectric 类加载器和 Mockito 的解决方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-15
    • 2014-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多