如何解决@在集成测试过程中未设置数据之前
我正在为JpaRepository创建一个集成测试,并且测试用例失败,并显示“找不到带有随机值rand的记录”,因为在查找结果中返回了null。
我的测试用例:
@SpringBoottest
class JpatestsApplicationTests {
@Autowired
private JpaRepo jpaRepo;
@Before
void setup() {
FirstTable firstTable1 = new FirstTable();
firstTable1.setUid("x");
firstTable1.setRandom("rand");
jpaRepo.save(firstTable1);
}
@Test
void testFindByRandom() {
FirstTable f = jpaRepo.findByRandom("rand");//find by random value 'rand'
Assert.notNull(f,"Record not found with random value rand ");
}
关联的实体:
@Entity
@Table(name = "table1")
public class FirstTable {
@Id
@GeneratedValue
private String uid;
@Column
private String random;
还有我的存储库:
@Repository
public interface JpaRepo extends JpaRepository<FirstTable,Long> {
FirstTable findByRandom(String rand);
}
我正在使用h2数据库。
为什么findByRandom的结果为null?还请注意,如果我将记录保存部分jpaRepo.save(firstTable1)
移到测试用例之内(在调用findByRandom(“ rand”)之前,它会通过。
如果将记录保存在带有@Before注释的setup()方法中,为什么不起作用?
解决方法
您必须在班级顶部添加@Transactional
。
@Transactional
将使您的测试在测试管理的事务中执行,该事务将在测试完成后回滚;在@Before
方法中执行的代码将在测试管理的事务中执行。
spring-boot-test的最新版本使用了junit 5,并且不推荐使用@Before。在类级别更改为带有@BeforeAll
注释的@TestInstance(TestInstance.Lifecycle.PER_CLASS)
后,它开始工作
我更新的测试班:
@SpringBootTest
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
class JpatestsApplicationTests {
@Autowired
private JpaRepo jpaRepo;
@BeforeAll
void setup() {
FirstTable firstTable1 = new FirstTable();
firstTable1.setUid("x");
firstTable1.setRandom("rand");
jpaRepo.save(firstTable1);
}
@Test
void testFindByRandom() {
FirstTable f = jpaRepo.findByRandom("rand");//find by random value 'rand'
Assert.notNull(f,"Record not found with random value rand ");
}
在BeforeEach之前选择BeforeAll,因为我在此类执行期间只需要运行一次。 参考:https://junit.org/junit5/docs/current/user-guide/
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。