未找到AndroidHttpClient(运行Robolectric时)

时间:2015-09-24 10:53:21

标签: android data-binding robolectric retrolambda

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

关于什么是错的想法?​​

5 个答案:

答案 0 :(得分:46)

AndroidHttpClient已从构建工具的第23版中的SDK中删除。

由于Robolectric针对早期版本运行,它预计它会在那里,这就是你看到这个错误的原因。

现在,您可以将其添加回来:

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

详细here

为Robolectric打开一张GitHub票据来解决这个问题。您可以关注主题/票证here

更新

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

答案 1 :(得分:17)

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

答案 2 :(得分:5)

明显的问题和解决方案:

Android HttpClient已从API Level 23中的SDK中删除,而Robolectric设置为使用SDK 21运行测试:

AndroidHttpClient was removed from the SDK in API Level 23

答案 3 :(得分:5)

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

目前有一个问题已打开here,因此一旦发布版本3.1,一切都应该没问题,您也不必使用此解决方法。

答案 4 :(得分:1)

如果目标SDK为28,则根据this,我们必须在AndroidManifest.xml中放置以下行

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