如果执行 @BeforeEach#repository.save(),则测试中的最终 UUID 更改

UnitTest final UUID changes within the test if @BeforeEach#repository.save() is executed

提问人:Mr. Kenneth 提问时间:11/16/2023 最后编辑:Mr. Kenneth 更新时间:11/16/2023 访问量:37

问:

我在下面有一个代码,我正在尝试通过 Uuid 获取有效订单OrderRepositoryTest

OrderRepositoryTest

@DataJpaTest
@ExtendWith(SpringExtension.class)
@AutoConfigureTestDatabase(connection = EmbeddedDatabaseConnection.H2)
public class OrderRepositoryTest {

    private static final Logger logger = LoggerFactory.getLogger(OrderRepositoryTest.class);

    @Autowired
    OrderRepository orderRepository;

    private static final UUID id2;

    Order order2 = setOrder2();

    static {
        id2 = UUID.randomUUID();
    }

    @BeforeEach
    public void setUp() {
        orderRepository.save(order2);
    }

    @AfterEach
    public void tearDown() {
        orderRepository.deleteAll();
    }

    @Test
    public void OrderRepositoryTest_getValidOrder() {

        Assertions.assertThat(id2).isEqualTo(order2.getUuid());

        // TODO unit test get valid order using orderRepository.findOrderByUuid()
    }

    public Order setOrder2() {

        return Order
                .builder()
                .uuid(id2)
                .build();
    }

}

Order

@Getter
@Setter
@Builder
@ToString
@Jacksonized
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "orders")
public class Order {

    @Valid

    @Id
    @GeneratedValue(strategy = GenerationType.UUID)
    UUID uuid;

    // TODO other columns
}

OrderRepository

public interface OrderRepository extends JpaRepository<Order, UUID> {
    Optional<Order> findOrderByUuid(UUID uuid);
}

我会得到错误:.但是,如果我注释 和 ,两个 uuids 匹配和测试都将通过。Expected [correct_uuid] but was [wrong_uuid]orderRepository.save(order2);orderRepository.deleteAll();

即使我运行 .save() 和 .delete() 方法,我的预期结果也应该是,因为 是最终变量,它应该始终相同。UUID id2

注意

我最初尝试将 id2 分配为:,但这也失败了。private static final UUID id2 = UUID.randomUUID();

注2

我可以做以下事情:

@Test
public void OrderRepositoryTest_getValidOrder() {

    UUID order2UUid = order2.getUuid();

    // TODO orderRepository.findOrderByUuid(order2UUid)
}

这将通过测试,但我觉得我应该能够使用最初分配的 UUID,因此我没有这样做。

java spring-boot 单元测试 junit junit5

评论


答:

2赞 Dyjah 11/16/2023 #1

“问题”是 id 是自动生成的,因为注释@GeneratedValue。当您调用 'orderRepository.save(order2);“ 时,构建订单时传递的 id 值将被忽略,并自动生成新的 UUID。

不应为 order 设置 id,因为它是由持久性层自动生成的。

评论

0赞 Mr. Kenneth 11/16/2023
这实际上是有道理的,而且奏效了。谢谢。我需要更改单元测试中的一些内容以适应信息。