【问题标题】:Accessing inner enum in another class for testing访问另一个类中的内部枚举以进行测试
【发布时间】:2014-06-30 19:42:35
【问题描述】:

如何访问另一个类中的内部枚举类?例如:

public class Foo {
    enum Bar {
        ONE, TWO, FOUR, EIGHT, SIXTEEN
    }

    // ...methods here
}

我正在尝试访问Foo.Bar 的课程:

public class FooTest {
    private Foo f;

    @Before
    public void setUp() throws Exception {
        f = new Foo();
    }

    public void testCase1() {
        assertEquals(Bar.ONE, f.climbUp());
    }
}

我试过Foo.Bar.ONEBar.ONE 以及使用Foo.class.getDeclaredField("Bar") 创建一个新变量,但这些似乎都不起作用。 getDeclaredClasses() 似乎让我 $Bar 但我无法从那里访问任何内容。

更新:我不允许修改类Foo

【问题讨论】:

  • 公开吧:public static enum Bar
  • “不工作”是什么意思(编译错误?运行时错误?测试失败?)这与反射有什么关系?
  • 如果您需要枚举不能从外部世界获得,但希望它可用于测试 - 默认级别是 package-private,因此您可以在同一个包中进行测试。

标签: java unit-testing enums


【解决方案1】:

如果目标是对其进行测试,但将枚举保持在默认可访问性 (package-private) 中,这意味着您无法编辑 Foo 和其他类的标题,那么一种常见的方法是在同一个包中进行测试。这意味着它可以访问具有 default 可见性 (see here) 的项目。

测试:

package com.scratch;

public class FooTest {
    public static void main(String[] args) {
        System.out.println(String.valueOf(Foo.Bar.ONE));
    }
}

另一个来源:

package com.scratch;

public class Foo {
    enum Bar {
        ONE, TWO;
    }
}

【讨论】:

    【解决方案2】:

    您不需要在这里使用反射。只需将枚举设为“静态”即可:

    public class Foo {
        static enum Bar {
            ONE, TWO, FOUR, EIGHT, SIXTEEN
        }
    
        // ...methods here
    }
    

    然后你可以通过 Foo.Bar.ONE 访问它

    【讨论】:

    • 忘了说我不能修改Foo
    • 枚举是隐式静态的(参见language spec),在这种情况下是否可以访问它不会改变。这里的问题是Access Modifier
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-30
    • 2018-01-22
    • 1970-01-01
    • 1970-01-01
    • 2012-01-17
    • 2010-11-15
    • 1970-01-01
    相关资源
    最近更新 更多