不能在 Spock 测试中使用不可变的 DTO

Cannot use immutable DTO in Spock test

我有不可变的 DTO

@Value
@Builder
public class UserDto {

    Long id;
    String username;
}

@Value 注释来自 project lombok。 它将所有字段标记为 privatefinal。此外 class 也被标记为 finalequals() hashCode()toString() 方法被生成。我发现在实现数据传输对象

时非常方便

使用 spock framework 编写测试时出现问题。 在测试中,我尝试模拟一些行为:

userFactory.create(userDto) >> user

抛出异常:

org.spockframework.mock.CannotCreateMockException: Cannot create mock for class user.dto.UserDto because Java mocks cannot mock final classes.

Spock框架或其他任何方式中是否有解决这些问题的方法?我真的很喜欢 @Value 注释,我不想删除它。

Lombok @NonFinal 注释可以在 class 上方使用,将此 class 标记为 non final。然后可以非常容易地创建不可变的DTO并且模拟没有问题。