java - Android 单元测试类的“private static final”成员将值更改为 null

标签 java android junit

我在 Android 项目中有一个 JUnit 测试用例,它包含如下代码:

private static final URI TEST_RESOURCE_URL = TasksService.TASKLIST_RESOURCELIST_URL.resolve("task/test.task");

public void setUp () {
    Log.i("Test", "TEST_RESOURCE_URL=" + TEST_RESOURCE_URL);
}

这个测试类有多个测试方法,其中一些方法引用(但不试图修改)这个常量的值。但是,当我运行这些测试 (Android 2.2.2) 时,所有这些测试都失败了,但第一个失败,并且 logcat 向我显示:

03-03 18:56:41.791: I/Test(12008): TEST_RESOURCE_URL=http://apate.meridiandigital.net/tasks/task/test.task
03-03 18:56:42.101: I/Test(12008): TEST_RESOURCE_URL=null
03-03 18:56:42.131: I/Test(12008): TEST_RESOURCE_URL=null
03-03 18:56:42.151: I/Test(12008): TEST_RESOURCE_URL=null
03-03 18:56:42.281: I/Test(12008): TEST_RESOURCE_URL=null
03-03 18:56:42.311: I/Test(12008): TEST_RESOURCE_URL=null
03-03 18:56:42.341: I/Test(12008): TEST_RESOURCE_URL=null
03-03 18:56:42.361: I/Test(12008): TEST_RESOURCE_URL=null
03-03 18:56:42.391: I/Test(12008): TEST_RESOURCE_URL=null
03-03 18:56:42.391: I/Test(12008): TEST_RESOURCE_URL=null

静态最终字段如何像这样更改值?我如何防止这种情况发生?还有其他可能发生的情况吗?

--- 编辑 1

我现在已将代码缩减为一个较小的示例,可以将其完整包含在内。见下文:

public class MyService extends Service {
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
}


public class StaticFinalTest extends ServiceTestCase<MyService> {
    public StaticFinalTest() {
        super(MyService.class);
    }

    public static final Object CONST2 = new Object();

    public void testA ()
    {
        assertNotNull (CONST2);
    }

    public void testB ()
    {
        assertNotNull (CONST2);
    }
}

当此测试运行时,testA 通过但 testB 失败。如果 testA 被注释掉,则 testB 通过。

它似乎很重要,它是一个 ServiceTestCase。标准的 JUnit TestCase 不会导致问题。如果“CONST2”是一个字符串,则两个测试都按预期通过。任何其他引用类型似乎都会重现该问题。

最佳答案

看起来 AndroidTestCasescrubClass 中的每个测试后使用反射将所有非原始字段设置为 null .它不检查字段是静态的还是最终的,所以这似乎是问题的根源。

要解决它,将字段更改为非最终字段并将其设置在 setUp 中。此外,确保将 super.setUp() 作为 setUp 的第一行调用,以确保正确初始化测试用例。

关于java - Android 单元测试类的“private static final”成员将值更改为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9548989/

相关文章:

java - SWT 4.2 中缺少 Platform.getBundle 方法

android - SlidingMenu(jfeinstein) - 如何控制二级滑动菜单

java - 在所有 Android 客户端上共享相同的 map

java - 使用 Mockito 进行 Android 仪器测试

java - Mock方法实现Junit mockito

Java操作系统认证

java - Glassfish上本地EJB的集成测试

java - getBeansOfType(Class<T> 类型)

java - 缓冲 REST 响应的方法

java - 为什么在 Google App Engine 中使用 HttpMethod.POST 而不是 HttpMethod.GET?