未找到 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"/>
我建立了一个非常简单的项目来测试 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"/>