我试图编写一些针对Android Keystore的测试用例,但是,当我编写以下测试用例时:
@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class, sdk = 21)
public class FancyPantsUnitTest {
@Test
public void buildKey() {
keyPairGenerator = KeyPairGenerator.getInstance("RSA", "AndroidKeyStore");
keyPairGenerator.initialize(4096);
final KeyPair keyPair = keyPairGenerator.generateKeyPair();
}
}
此操作失败,但出现以下异常:
org.junit.ComparisonFailure: expected:<null> but was:<java.security.KeyStoreException: AndroidKeyStore not found>
我的目标是API级别23,如果有帮助的话。
2条答案
按热度按时间jhiyze9q1#
在https://github.com/robolectric/robolectric/issues/1518上已经有关于这个问题的讨论。
简而言之:
来自java.security.安全javadoc:
安全属性的默认值是从特定于实现的位置读取的,该位置通常是Java安装目录中的属性文件lib/security/java.security。
......我们可能不想鼓励人们去胡闹。
看起来这需要是一个方法拦截规则...
尝试PowerMockito时也会发生同样的情况。
aemubtdh2#
Matthew Dolan在他的article中提出了一个出色的解决方案。
下面是创建
FakeAndroidKeyStore
的代码在调用
java.security.KeyStore
之前使用。例如: