【问题标题】:AndroidHttpClient not found (when running Robolectric)未找到 AndroidHttpClient(运行 Robolectric 时)
【发布时间】:2015-12-21 22:46:46
【问题描述】:

我建立了一个非常简单的项目来测试 Robolectric + Data Binding + Retrolambda 的集成。当我运行测试服时,我收到以下消息:

Error:(30, 30) Gradle: error: cannot access AndroidHttpClient
class file for android.net.http.AndroidHttpClient not found

这很奇怪,因为我没有在任何地方使用 AndroidHttpClient。


错误发生在这里,在“活动”行:

@Before
public void setup() {
    activity = Robolectric.setupActivity(MainActivity.class); // Error on this line
    textView = (TextView) shadowOf(activity).findViewById(R.id.textView);
    button = (Button) activity.findViewById(R.id.button);
    editText = (EditText) activity.findViewById(R.id.editText);
}

该程序从不使用 AndroidHttpClient。其实这就是整个程序:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    final ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);

    binding.setUser(new User());
    binding.button.setOnClickListener((v) -> {
        binding.textView.setText(String.format("Hello, %s!", binding.editText.getText()));
        binding.editText.setText("");
    });
}

关于哪里出了问题的想法?

【问题讨论】:

  • AndroidHttpClient 在 API 级别 23 中已从 SDK 中删除,因此如果您的 compileSdkVersion 为 23 或更高,则可以解释为什么找不到该类。至于为什么 Robolectric 试图访问该类,我不能说。
  • 解决了!我正在运行测试:“@Config(constants = BuildConfig.class, sdk = 21)”。谢谢!
  • 写一个答案,让每个人都受益

标签: android data-binding robolectric retrolambda


【解决方案1】:

如果目标 SDK 为 28 或更高,则根据this,我们必须在 AndroidManifest.xml 中添加以下行

<uses-library android:name="org.apache.http.legacy" android:required="false"/>

【讨论】:

    【解决方案2】:

    AndroidHttpClient 在 v23 的构建工具中已从 SDK 中删除。

    由于 Robolectric 是针对早期版本运行的,它希望它存在,这就是您看到此错误的原因。

    现在,您可以将其重新添加:

    android {
        useLibrary 'org.apache.http.legacy'
    }
    

    详细here

    Robolectric 有一张 GitHub 票可以解决这个问题。您可以关注线程/票here

    更新:

    正如一些人正确指出的那样,更好的方法是在您的测试资源中创建一个类android.net.http.AndroidHttpClient。这将是一种首选方法,因为您只是修改测试源,而不是生产代码,以适应测试。

    【讨论】:

    • 请不要那样做。通过添加过时的库,您会使用仅用于测试的代码来膨胀您的应用程序。
    • 错误:任务 ':app:transformClassesWithJarMergingForDebug' 执行失败。 > com.android.build.api.transform.TransformException:java.util.zip.ZipException:重复条目:org/apache/http/ConnectionClosedException.class
    • @DmitryZaytsev 好点。由于答案受到了很多关注,因此我对其进行了更新。
    【解决方案3】:

    我能够通过在新包android.net.http 中创建一个名为AndroidHttpClient 的新类来解决这个问题。之后,我必须用 @Config(constants = BuildConfig.class, sdks = 21) 注释我的单元测试类,这将针对 API 21 的模拟版本运行测试,这是 Android Robolectric 目前支持的最后一个版本。

    目前有一个问题已打开 here,因此一旦他们发布了 3.1 版,一切都会好起来的,您不必使用此解决方法。

    【讨论】:

      【解决方案4】:

      我刚刚在我的测试源中添加了假类android.net.http.AndroidHttpClient。它现在解决了这个问题。等待 Robolectric 更新

      【讨论】:

      • 这以最小的影响为我解决了这个问题。使用useLibrary 会导致将额外的项目捆绑到您的主应用程序中,而在src/test/java 下添加此类对主应用程序没有影响。
      【解决方案5】:

      明显问题及解决方案:

      AndroidHttpClient 在 API 级别 23 中已从 SDK 中移除,而 Robolectric 被设置为使用 SDK 21 运行测试:

      AndroidHttpClient was removed from the SDK in API Level 23
      

      【讨论】:

      • 我遇到了同样的问题,实际的解决方案是什么?对我来说,使用 API Level 22 编译可能不是答案。
      • 我记得,AndroidHttpClient 问题是由为 robolectric (21) 和 compileSdkVersion (23) 设置的 sdk 版本之间的差异引起的。但是,我编写了这个项目来评估数据绑定库,最终得出结论仍然存在太多问题。
      猜你喜欢
      • 1970-01-01
      • 2022-11-06
      • 2014-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-09
      • 1970-01-01
      相关资源
      最近更新 更多