未找到 AndroidHttpClient(当 运行 Robolectric 时)

AndroidHttpClient not found (when running Robolectric)

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

有什么问题吗?

明显的问题和解决方案:

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

AndroidHttpClient was removed from the SDK in API Level 23

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

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

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

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

详细here

GitHub 有一个 Robolectric 的工单可以解决这个问题。可以关注thread/tickethere.

更新:

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

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

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

目前有一个未解决的问题 here,所以一旦他们发布 3.1 版,一切都应该没问题,您将不必使用此解决方法。

如果目标 SDK 为 28 或更高版本,则根据 this,我们必须在 AndroidManifest.xml

中添加以下行
<uses-library android:name="org.apache.http.legacy" android:required="false"/>