【问题标题】:Robolectric with AndroidAnnotations make tests hang/not running带有 AndroidAnnotations 的 Robolectric 使测试挂起/不运行
【发布时间】:2015-10-12 20:35:14
【问题描述】:

我正在尝试使用 Robolectric 库配置一个基本应用程序。我正在使用最新版本 (3.0) 以及最新的 AndroidAnnotations 版本 (3.3.2) 和 Gradle 1.4.0。

在解决了诸如 AndroidHttpClient 异常之类的一些问题之后,我设法通过一个非常简单的测试完成了它。

现在我想使用 Activity 进行进一步测试,但无法运行测试。测试以某种方式挂起并且永远不会产生(每个测试都出现黄色旋转)。

这似乎是由于 @Before 设置而发生的,因为它在评论时会产生。但是为什么我不能使用这个注释来设置我的活动呢?特别是当我使用带注释的 Activity(而不是生成的 Activity_)时它会产生,这不是使用 AndroidAnnotations 时测试的正确方法。

这是我仍然无法执行的截断测试类...:

@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class, sdk = Build.VERSION_CODES.LOLLIPOP)
public class MapActivityTest {

  private MapActivity_ mMapActivity;

  @Before
  public void setup() {
    mMapActivity = Robolectric.buildActivity(MapActivity_.class).create().get();
  }

  @Test
  public void checkActivityNotNull() throws Exception {
    assertNotNull(mMapActivity);
  }

}

如果有帮助的话,我也在使用 Java 1.8。

有谁知道是什么导致了这个问题?

已经谢谢了!

更新:

降级到 Java 7 后尝试,结果相同。

【问题讨论】:

  • 您的网络连接良好吗? Robolectric 首先下载大的依赖项。也尝试从命令行运行。我也会尝试降级到 Java 7,我不确定 Robolectric 是否可以支持 Java 8。
  • 是的,可靠的互联网连接和下载需要一段时间:) 也在命令行中尝试过,结果相同,但没有成功。我会尝试 Java 7 我猜这可能是个问题。
  • Dang... 在拥有 Java 8 的同时降级并不容易。无法摆脱它!
  • 好的,终于为Android Studio设置了Java 7。但不幸的是同样的结果......
  • 这是一个大项目吗?你能分享一下吗?如果没有,请尝试调试并在挂起时暂停它,并检查当前堆栈跟踪

标签: java android robolectric android-annotations


【解决方案1】:

AndroidAnnotations 对 robolectric 来说不是问题。

经过一些线程转储后,我发现了循环代码。 KBLocationProvider 类包含以下 sn-p

boolean isPermissionGranted = ActivityCompat.checkSelfPermission(activity, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED;
if (!isPermissionGranted) {          
    ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_CODE_LOCATION);
}

checkSelfPermission(...) 方法永远不会返回 true。此方法在上下文中调用 checkPermission(..) 方法。 checkPermission(..) 的简短 search 显示了 ShadowApplicationTest,它显示了 checkPermission 的用法。

https://github.com/robolectric/robolectric/blob/867a805f36d7492ba80f150836bf88b97c3248e0/robolectric/src/test/java/org/robolectric/shadows/ShadowApplicationTest.java#L532

添加以下行后,您的测试就完成了。

@Before
public void setup() {
    Shadows.shadowOf(RuntimeEnvironment.application).grantPermissions(Manifest.permission.ACCESS_FINE_LOCATION);
    mMapActivity = Robolectric.buildActivity(MapActivity_.class).create().get();
}

当权限被拒绝时,您似乎遇到了无限循环的问题。

【讨论】:

  • 非常感谢@nenick,你做了很多挖掘工作。以后我会更加小心新的权限系统;)
猜你喜欢
  • 2014-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-16
  • 2016-06-25
  • 2015-07-08
  • 2017-02-03
相关资源
最近更新 更多