微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

@在集成测试过程中未设置数据之前

如何解决@在集成测试过程中未设置数据之前

我正在为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 举报,一经查实,本站将立刻删除。