【发布时间】:2020-04-08 15:00:16
【问题描述】:
以下代码适用于我的 bean 使用带有自定义构建器的 Lombok Builder 注释。
当我想用值创建这个 bean 时,我遇到了测试问题。 由于自定义构建器,我不能再使用 Setters(有意)并且不能只使用 .builder()。
我的问题是,如何在我的测试中创建这个 bean?请注意,我确实想使用构建器,而不是希望使用 Lombok 的 @Value 注释。自定义构建器是与 Jackson 合作所必需的。
我能想到的一种可能性是在自定义构建器中添加一个构造函数,我希望不需要仅仅为了测试而这样做。
请指教。谢谢。
工作 Bean 设置。
@Getter
@JsonDeserialize(builder = MyData.MyDataBuilder.class)
@Builder(builderClassName = "MyDataBuilder", toBuilder = true)
public class MyData {
@JsonProperty("some_key")
private String skey;
@JsonProperty("name")
private String name;
// needed to work with Jackson
@JsonPOJOBuilder(withPrefix = "")
static class MyDataBuilder {}
}
测试尝试创建对象。如上所述,以下将不起作用。
MyData.builder()
.skey("12345")
.name("some_name")
.build();
或
MyData myData = new MyData();
myData.skey("12345");
myData.name("some_name");
【问题讨论】:
-
为什么不使用
builder()方法?您是否从不同的包进行测试?然后让你的构建器类public。 -
@JanRieke 是的,睾丸来自不同的包装。如果我将 MyDataBuilder 公开,它会起作用。但同样,为了测试而公开一个类。不确定这是否理想。如果没有其他选择,那是我目前的解决方案。编辑:读到你提到同样的事情。是的,这就是我目前所依赖的地方。
-
如果类和构造函数是公开的,那么我看不出构建器类不应该公开的令人信服的理由。我的意思是,如果您添加一个构建器,那应该是首选的实例化方式,因此您通常应该使其与类一样可见。如果你不希望你的类在别处被实例化,那么你的测试也在错误的包中。
-
@JanRieke 这是一个公平的观点。我会公开的。谢谢。