Java 在JUnit测试中使用setter,但在类中没有setter

Java 在JUnit测试中使用setter,但在类中没有setter,java,spring,testing,junit,Java,Spring,Testing,Junit,假设我有一个名为Foo的实体,它具有id和name(简化了类): 在我的应用程序中,我不希望在任何地方手动设置id。因为foo将只来自DB。所以我没有为它创建一个setter 现在我想要JUnit测试一些方法,在这里我想要实例化foo。是否可以仅为JUnit测试设置id 注意:一种可能的解决方案是首先从DB接收foo,然后进行测试。但是我想避免数据库调用。如果有必要知道的话,我正在使用Spring和jpa。谢谢。简单而完美的解决方案是使用ReflectionTestUtils @Test pub

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

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

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

注意:一种可能的解决方案是首先从DB接收
foo
,然后进行测试。但是我想避免数据库调用。如果有必要知道的话,我正在使用
Spring
jpa

谢谢。简单而完美的解决方案是使用
ReflectionTestUtils

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

请注意:
ReflectionTestUtils
来自Spring:
org.springframework.test.util.ReflectionTestUtils
ReflectionTestUtils.setField(foo,“id”,1L)类似的东西。如果你使用JPA接收数据,你也需要一个setter。当你使用JPA时,你不需要setter。这取决于您使用的模式(基于字段或属性)。您可以使用反射(搜索关键字,您将找到大量信息),也可以扩展您的类,创建自己的构造函数并覆盖
getId()
。另见@M.Deinum谢谢。完美且简单的解决方案。以前从未听说过
ReflectionTestUtils
。如果你想提供答案,我会接受你的。
@Test
public void testFoo() {
  Foo foo = new Foo();
  ReflectionTestUtils.setField(foo, "id", 1L);
  // assertion
}