是否可以通过单元测试工厂方法进行证书固定以进行改造?

时间:2016-08-03 07:44:57

标签: android junit mockito retrofit2 okhttp3

对于我们的应用,我们使用ApiFactory来创建Retrofit个客户端。工厂方法还会使List<String>个主机名和List<X509Certificate> OkHttpClientCertificatePinner 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

有什么想法吗?它甚至可能吗?

感谢您的帮助!

0 个答案:

没有答案