AndroidHttpClient未找到(运行Robolectric时)

31

我已经建立了一个非常简单的项目,用于测试Robolectric + Data Binding + Retrolambda的集成。当我运行测试套件时,我会收到以下消息:

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

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


错误出现在这里,在“activity”那一行:

@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("");
    });
}

有什么问题的想法吗?


3
在API Level 23中,AndroidHttpClient已从SDK中删除,因此如果您的compileSdkVersion为23或更高版本,则可以解释为什么找不到该类。至于为什么Robolectric试图访问该类,我无法说。 - CommonsWare
搞定了!我是用这个来运行测试的:“@Config(constants = BuildConfig.class, sdk = 21)”。谢谢! - Technocrat
写一篇答案,让每个人都受益。 - Eugen Martynov
5个回答

49

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

由于Robolectric正在运行早期版本,因此它期望它仍然存在,这就是为什么您会看到这个错误的原因。

目前,您可以将其添加回去:

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

详见此处

已有GitHub工单针对Robolectric进行修复。你可以在此处关注该线程/工单。

更新:

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


6
请不要这样做。通过添加过时的库,你会使你的应用程序膨胀,其中包含仅用于测试的代码。 - Dmitry Zaytsev
错误:执行任务“:app:transformClassesWithJarMergingForDebug”失败。
com.android.build.api.transform.TransformException:java.util.zip.ZipException:重复条目:org / apache / http / ConnectionClosedException.class
- Iman Marashi
@DmitryZaytsev 很好的观点。由于这个答案受到了相当多的关注,我已经更新了它。 - Ben Pearson

17

我刚刚在我的测试源代码中加入了一个假的类android.net.http.AndroidHttpClient,目前问题已经解决了。现在正在等待Robolectric更新。


1
这对我来说解决了问题,而且影响最小。使用 useLibrary 会导致额外的项目被捆绑到您的主应用程序中,而将此类添加到 src/test/java 下对主应用程序没有任何影响。 - Craig Russell

6

表面问题和解决方案:

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

AndroidHttpClient was removed from the SDK in API Level 23

我遇到了同样的问题,实际的解决方案是什么?对我来说,使用API Level 22编译可能不是一个答案。 - David Berry
据我回忆,AndroidHttpClient问题是由于robolectric设置的sdk版本(21)和compileSdkVersion(23)之间存在差异引起的。然而,我编写了这个项目来评估数据绑定库,最终得出结论仍然存在太多问题。 - Technocrat

5
我通过创建一个名为AndroidHttpClient的新类并置于新包android.net.http中来解决了这个问题。之后,我需要在我的单元测试类上注释@Config(constants = BuildConfig.class, sdks = 21)以针对模拟的API 21版本运行测试,这是Android Robolectric目前支持的最后一个版本。
目前有一个问题已经被开放在这里,所以一旦他们发布3.1版本,一切都将恢复正常,您就不必使用这个解决方法了。

5
如果目标SDK为28或更高版本,则根据这篇文章,我们必须在AndroidManifest.xml中添加以下行:
<uses-library android:name="org.apache.http.legacy" android:required="false"/>

1
谢谢Naveed!我已经为此奋斗了几个小时。编辑:(我的错误是由于:java.lang.ClassNotFoundException: android.net.http.AndroidHttpClient,希望通过爬虫将一些额外的人指向这个页面,因为完整的跟踪不在问题中。) - Dean Solecki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接