未找到AndroidHttpClient(运行Robolectric时)

Tec*_*rat 29 data-binding android robolectric retrolambda

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

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

这很奇怪,因为我不在任何地方使用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);
}
Run Code Online (Sandbox Code Playgroud)

该程序从不使用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("");
    });
}
Run Code Online (Sandbox Code Playgroud)

关于什么是错的想法?

Ben*_*son 46

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

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

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

android {
    useLibrary 'org.apache.http.legacy'
}
Run Code Online (Sandbox Code Playgroud)

详见这里.

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

更新:

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

  • 请不要这样做.通过添加过时的库,您的应用程序会使用仅用于测试的代码. (6认同)

Eug*_*nov 17

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


Tec*_*rat 5

明显的问题和解决方案:

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

AndroidHttpClient was removed from the SDK in API Level 23
Run Code Online (Sandbox Code Playgroud)


Cod*_*gel 5

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

目前在这里打开一个问题,所以一旦发布版本3.1,一切都应该没问题,你不必使用这种解决方法.


Nav*_*Ali 5

如果目标 SDK 是 28 或更大,那么根据,我们必须在 AndroidManifest.xml 中添加以下行

<uses-library android:name="org.apache.http.legacy" android:required="false"/>
Run Code Online (Sandbox Code Playgroud)