【问题标题】:Use a setter in JUnit test without having one in class [duplicate]在 JUnit 测试中使用 setter 而没有类中的 setter [重复]
【发布时间】:2016-07-14 08:33:43
【问题描述】:

假设我有一个名为 Foo 的实体,带有一个 id 和一个 name(简化了类):

public class Foo {

    private long id;
    private String name;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public long getId() {
        return id;
    }
}

在我的应用程序中,我不希望在任何地方手动设置 id。因为foo 只会来自数据库。所以我没有为它创建一个setter。

现在我想要 JUnit 测试一些我想要实例化 foo 的方法。是否可以为 JUnit 测试设置 id

P.S.:一个可能的解决方案是先从数据库接收foo 并进行测试。但要避免 DB 调用。如果有必要知道,我正在使用Springjpa

【问题讨论】:

  • ReflectionTestUtils.setField(foo, "id", 1L); 类似的东西。
  • 如果你使用 jpa 接收数据,你也需要一个 setter
  • 使用 JPA 时不需要设置器。这取决于您使用的模式(基于字段或属性)。
  • 您可以使用反射(搜索关键字,您会发现大量信息)或者您可以扩展您的类,创建自己的构造函数并覆盖getId()。另见how-to-test-a-class-that-has-private-methods-fields-or-inner-classes
  • @M.Deinum 谢谢。完美而简单的解决方案。以前从未听说过ReflectionTestUtils。如果你想提供答案,我会接受你的。

标签: java spring testing junit


【解决方案1】:

感谢M. Deinum's comment。简单而完美的解决方案是使用ReflectionTestUtils

@Test
public void testFoo() {
  Foo foo = new Foo();
  ReflectionTestUtils.setField(foo, "id", 1L);
  // assertion
}

请注意:ReflectionTestUtils 来自 Spring:org.springframework.test.util.ReflectionTestUtils

【讨论】:

    猜你喜欢
    • 2019-02-27
    • 1970-01-01
    • 1970-01-01
    • 2017-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多