我在下面有一个
OrderRepositoryTest
代码,我试图通过 Uuid 获取有效订单
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);
}
我会收到错误:
Expected [correct_uuid] but was [wrong_uuid]
。但是,如果我评论 orderRepository.save(order2);
和 orderRepository.deleteAll();
,则两个 uuid 都匹配并且测试将通过。
即使我运行 .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,因此我没有这样做。
我相信问题在于 id 是由数据库自动生成的,因为注释 @GenerateValue。当您调用“orderRepository.save(order2);”时您在构建订单时传递的 id 值将被忽略,并生成一个新的 UUID。