首页 > 解决方案 > 使用 JUnit 测试构造函数(或设置器)的最佳方法是什么?

问题描述

我有两种解决方案来测试我的构造函数(或设置器)。

首先是使用getters.

public void Test() {
    Person p = new Person("toto"); // name
    assertEquals("toto", p.getName());
}

二是使用Field

public void Test() {
    Person p = new Person("toto"); // name
    final Field fieldName = p.getClass().getDeclaredField("name");
    fieldName.setAccessible(true);
    assertEquals("toto", fieldName.get(p));
}

你的建议是什么,为什么?谢谢你。

标签: javajunit

解决方案


IMO,应尽可能避免反射。当然,在某些情况下需要它,但在大多数情况下,不值得在性能和安全性上进行大量权衡。

其次,可以说更重要的是,如果测试一段代码的唯一方法是使用反射,那么您可能不需要测试它。

考虑以下示例:

public class Message {
    private String message;

    public Message(Message message) {
        this.message = message;
    }

//  NO GETTERS/SETTERS
}

如果我想测试这个构造函数是否“有效”,我可以编写一个测试,使用反射来查看我的对象内部并检查消息是否与构造函数参数匹配。但这有什么好处呢?

大概,我希望这个消息类以某种方式被另一段代码使用。该代码如何工作?我会发现我可能需要一种getMessage()方法或等效的东西来对对象做任何有用的事情。

一般来说,在单元测试中使用反射是不好的,因为它测试的是底层实现,而不是行为。当有人出现时,您的单元测试不应该中断,例如,重构代码以将数据存储在远程服务器上。

另外,我会避免用像这样的“琐碎”的测试来混淆测试。专注于测试您的业务逻辑。相信 JVM 在很大程度上可以像宣传的那样工作。


推荐阅读