31

我建立了一个非常简单的项目来测试 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("");
    });
}

关于有什么问题的想法?

4

5 回答 5

48

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

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

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

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

如此处详述。

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

更新:

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

于 2015-10-01T10:12:39.177 回答
17

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

于 2015-10-02T22:56:53.853 回答
6

明显问题及解决方案:

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

AndroidHttpClient was removed from the SDK in API Level 23
于 2015-09-25T07:13:45.503 回答
5

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

目前这里有一个问题,所以一旦他们发布了 3.1 版,一切都会好起来的,您不必使用此解决方法。

于 2015-11-18T16:49:03.987 回答
4

如果目标 SDK 是 28 或更高,那么根据这个,我们必须在 AndroidManifest.xml 中放入以下行

<uses-library android:name="org.apache.http.legacy" android:required="false"/>
于 2018-10-19T16:23:59.810 回答