对于我们的应用,我们使用ApiFactory
来创建Retrofit
个客户端。工厂方法还会使List<String>
个主机名和List<X509Certificate>
OkHttpClient
加CertificatePinner
null
。但这些列表也可以是null
。当这些列表不是@Test
public void testCertificatePinning() {
try {
InputStream in = new ByteArrayInputStream(Base64.decodeBase64(fakeCertString()));
CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
X509Certificate cert = (X509Certificate)certFactory.generateCertificate(in);
List<X509Certificate> certificates = Collections.singletonList(cert);
List<String> hostsToSecure = Collections.singletonList("myhost.com");
ITestFakeApi api = ApiFactory.createRetrofit(ITestFakeApi.class, true, TEST_ENDPOINT, hostsToSecure, certificates);
/*
What should I put here?
*/
} catch (CertificateException e) {
e.printStackTrace();
}
}
private interface ITestFakeApi {
@GET("/fake/path")
Call<Void> getFake();
@Headers("Accept: application/json")
@GET("/superfake/path")
Call<Void> getFakeWithHeaders();
}
private String fakeCertString() {
return "MIIExDCCA6ygAwIBAgIJAK0JmDc/YXWsMA0GCSqGSIb3DQEBBQUAMIGcMQswCQYD\n" +
"VQQGEwJJTjELMAkGA1UECBMCQVAxDDAKBgNVBAcTA0hZRDEZMBcGA1UEChMQUm9j\n" +
"a3dlbGwgY29sbGluczEcMBoGA1UECxMTSW5kaWEgRGVzaWduIENlbnRlcjEOMAwG\n" +
"A1UEAxMFSU1BQ1MxKTAnBgkqhkiG9w0BCQEWGmJyYWphbkBSb2Nrd2VsbGNvbGxp\n" +
"bnMuY29tMB4XDTExMDYxNjE0MTQyM1oXDTEyMDYxNTE0MTQyM1owgZwxCzAJBgNV\n" +
"BAYTAklOMQswCQYDVQQIEwJBUDEMMAoGA1UEBxMDSFlEMRkwFwYDVQQKExBSb2Nr\n" +
"d2VsbCBjb2xsaW5zMRwwGgYDVQQLExNJbmRpYSBEZXNpZ24gQ2VudGVyMQ4wDAYD\n" +
"VQQDEwVJTUFDUzEpMCcGCSqGSIb3DQEJARYaYnJhamFuQFJvY2t3ZWxsY29sbGlu\n" +
"cy5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDfjHgUAsbXQFkF\n" +
"hqv8OTHSzuj+8SKGh49wth3UcH9Nk/YOug7ZvI+tnOcrCZdeG2Ot8Y19Wusf59Y7\n" +
"q61jSbDWt+7u7P0ylWWcQfCE9IHSiJIaKAklMu2qGB8bFSPqDyVJuWSwcSXEb9C2\n" +
"xJsabfgJr6mpfWjCOKd58wFprf0RF58pWHyBqBOiZ2U20PKhq8gPJo/pEpcnXTY0\n" +
"x8bw8LZ3SrrIQZ5WntFKdB7McFKG9yFfEhUamTKOffQ2Y+SDEGVDj3eshF6+Fxgj\n" +
"8plyg3tZPRLSHh5DR42HTc/35LA52BvjRMWYzrs4nf67gf652pgHh0tFMNMTMgZD\n" +
"rpTkyts9AgMBAAGjggEFMIIBATAdBgNVHQ4EFgQUG0cLBjouoJPM8dQzKUQCZYNY\n" +
"y8AwgdEGA1UdIwSByTCBxoAUG0cLBjouoJPM8dQzKUQCZYNYy8ChgaKkgZ8wgZwx\n" +
"CzAJBgNVBAYTAklOMQswCQYDVQQIEwJBUDEMMAoGA1UEBxMDSFlEMRkwFwYDVQQK\n" +
"ExBSb2Nrd2VsbCBjb2xsaW5zMRwwGgYDVQQLExNJbmRpYSBEZXNpZ24gQ2VudGVy\n" +
"MQ4wDAYDVQQDEwVJTUFDUzEpMCcGCSqGSIb3DQEJARYaYnJhamFuQFJvY2t3ZWxs\n" +
"Y29sbGlucy5jb22CCQCtCZg3P2F1rDAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEB\n" +
"BQUAA4IBAQCyYZxEzn7203no9TdhtKDWOFRwzYvY2kZppQ/EpzF+pzh8LdBOebr+\n" +
"DLRXNh2NIFaEVV0brpQTI4eh6b5j7QyF2UmA6+44zmku9LzS9DQVKGLhIleB436K\n" +
"ARoWRqxlEK7TF3TauQfaalGH88ZWoDjqqEP/5oWeQ6pr/RChkCHkBSgq6FfGGSLd\n" +
"ktgFcF0S9U7Ybii/MD+tWMImK8EE3GGgs876yqX/DDhyfW8DfnNZyl35VF/80j/s\n" +
"0Lj3F7Po1zsaRbQlhOK5rzRVQA2qnsa4IcQBuYqBWiB6XojPgu9PpRSL7ure7sj6\n" +
"gRQT0OIU5vXzsmhjqKoZ+dBlh1FpSOX2";
}
时,我想对工厂的部分进行单元测试。但是,如果模拟证书附加到改装界面,我不知道如何测试。
这是我到目前为止所做的:
public static <T> T createAuthenticatedRetrofit(final Class<T> klass,boolean debugMode, final String endpoint, List<String> hostsToSecure, List<X509Certificate> certificates) {
HttpLoggingInterceptor loggingInterceptor = provideHttpLoggingInterceptor(debugMode);
OkHttpClient okHttpClient = provideOkHttpClient(loggingInterceptor,hostsToSecure,certificates);
final Retrofit retrofit = new Retrofit.Builder()
.baseUrl(endpoint)
.client(okHttpClient)
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create(provideGson()))
.build();
return retrofit.create(klass);
}
private static OkHttpClient provideOkHttpClient(HttpLoggingInterceptor interceptor,
List<String> hostsToSecure,List<X509Certificate> certificates) {
OkHttpClient.Builder builder = new OkHttpClient.Builder()
// some other config stuff
.connectTimeout(CONNECTION_TIMEOUT_SECONDS, TimeUnit.SECONDS)
.addNetworkInterceptor(interceptor);
// not under test coverage
if(certificates != null && !certificates.isEmpty() && hostsToSecure != null && !hostsToSecure.isEmpty()){
builder.certificatePinner(provideCertificatePinner(hostsToSecure, certificates));
}
// end
return builder.build();
}
这是我要测试的功能,我标记了尚未覆盖的行,需要覆盖。
/etc/fstab
有什么想法吗?它甚至可能吗?
感谢您的帮助!