【问题标题】:Android unit testing and class member visibilityAndroid 单元测试和类成员可见性
【发布时间】:2012-09-14 15:53:04
【问题描述】:

已经创建了一个android测试项目,目前正在尝试编写android单元测试

现在,如果您有一堆类,您正在尝试测试其方法,并且您做得很好并且应用了最少访问原则并将所有成员变量设为私有,那么您如何编写有效的单元测试?

换句话说,我的单元测试位于我要测试的类之外的类中,因此我无法访问我的断言语句中的任何成员变量

对于这种情况是否有解决方法,您希望访问所有内容以进行测试

请不要告诉我,我必须为每个成员变量编写 getter 和 setter,这样我才能编写一些单元测试

(仔细想想,这更像是一个 Java 问题,而不是一个 android 特定的问题)

【问题讨论】:

    标签: java android unit-testing


    【解决方案1】:

    有趣的问题...尽管您可能必须为每个成员变量编写 getter/setter。将它们放在仅用于测试的子类中可能是值得的,这样您就可以轻松地在生产代码中保留封装。

    这是我能想到的最佳解决方案。

    编辑:或者您可以创建一个重复的类进行测试,您可以快速将所有“私有”替换为“公共”。

    【讨论】:

    • hmmm - 这一定很常见,以至于成为某种“模式” - 希望有一种聪明的方法可以在没有大量样板的情况下解决它。我不得不承认我已经考虑过快速搜索和替换,但那有点臭
    • @Hiett 同意了。这个问题有一些有趣的答案:stackoverflow.com/questions/34571/…
    • 我认为这个问题链接会让我坚持一段时间 - 非常感谢您挖掘它...
    【解决方案2】:

    如果您真的不想编写 getter 并且想要验证字段变量,您仍然可以通过反射访问类字段变量并对它们进行断言,如下所示:

    目标类:

    public class TestMe{
        private String value = null;
    
        public void update(){
            value = "hello";
        }
    }
    

    测试:

    public class TestMeTest {
    
        @Test
        public void testUpdate() throws NoSuchFieldException, IllegalAccessException {
    
            TestMe testMe = new TestMe();
    
            assertNull(getField(testMe, "value"));
    
            testMe.update();
    
            assertEquals("hello", getField(testMe, "value"));
    
        }
    
        private Object getField(Object root, String name) throws NoSuchFieldException, IllegalAccessException {
    
            Field field = root.getClass().getDeclaredField(name);
            field.setAccessible(true);
    
            Object value = field.get(root);
    
            field.setAccessible(false);
    
            return value;
        }
    }
    

    【讨论】:

    • 你真的使用它还是只写getter? - 我猜您将发现的一堆潜在错误从编译时转移到运行时
    • 就个人而言,我会为您想要访问的字段编写 getter。使用反射,尤其是使用字符串键可能很脆弱。这是可能的,根据您的要求可能是万恶之源。
    • 另外,使用这种技术,您可以将潜在错误从编译时转移到单元测试运行时,如果出现错误,这应该会阻止您将这些错误引入应用程序的运行时。
    猜你喜欢
    • 2011-07-07
    • 1970-01-01
    • 2016-10-21
    • 1970-01-01
    • 2012-05-26
    • 1970-01-01
    • 2013-03-27
    • 1970-01-01
    • 2012-03-02
    相关资源
    最近更新 更多