【问题标题】:How to test when bean is using a custom Lombok Builder如何测试 bean 何时使用自定义 Lombok Builder
【发布时间】: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 这是一个公平的观点。我会公开的。谢谢。

标签: java jackson lombok


【解决方案1】:

您可以自定义构建器类以获得您想要的任何访问级别。如果您不自定义,Lombok 会默认设置为 public

如果类本身和至少一个构造函数是public,则可以从任何地方创建实例(不仅仅是同一个包)。但是在大多数情况下,构建器类也没有理由不应该是 public:如果构建器模式在其包中是有益的,那么它可能在其他任何地方也有益。

如果你不希望你的类在其他包中被实例化,那么构建器不应该是public(也没有构造器)。但是,您的测试也存在某种缺陷或错误的包。

所以要么创建自定义构建器类public,要么更改您的测试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-04
    • 2019-03-03
    • 1970-01-01
    • 2020-10-08
    • 2021-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多