【发布时间】: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