我正在使用SpringBoot/Kotlin/JPA/Hibernate/Junit并且有JpaServiceTest类,它可以执行属于单个实体的存储库方法。 JpaService Class的方法名称遵循约定findByXXXXId
,findAll
,updateXXXX
,addXXXX
和deleteXXXX
。DataJPATest Junit方法命名和NullPointerExceptions
为了保持一致性,我使用相同的约定为JpaTest类中的方法命名。我的JpaTest类有两个findById场景,其中'Null'预期是另一个映射实体返回的地方。我的应用程序按预期工作,但是我的测试类在预期返回有效实体的findById方案上失败。
The service class
@Service("MyService")
@Transactional
internal class JpaMyService(val MyRepo: MyRepository) : MyService {
val log = LoggerFactory.getLogger("MyService")
override fun findByMyId(MyId: Long): MyDto? {
log.debug("Retrieving My: {}", MyId)
return MyRepo.findOne(MyId)?.toDto()
}
override fun findAllMys(): List<MyDto> {
log.debug("Retrieving Mys")
return MyRepo.findAll().map { it.toDto() }
}
override fun updateMy(id: Long?, My: UpdateMyDto): MyDto? {
log.debug("Updating My: {} with data: {}", id, My)
val currentMy = MyRepo.findOne(id)
return if (currentMy != null) MyRepo.save(MyEntity.fromDto(My, currentMy)).toDto()
else null
}
override fun addMy(My: CreateMyDto): MyDto {
log.debug("Adding My: {}", My)
return MyRepo.save(MyEntity.fromDto(My)).toDto()
}
override fun deleteMy(id: Long?) {
log.debug("Deleting My: {}", id)
MyRepo.delete(id)
}
有问题的方法
@Test
fun `'findMyById' should map existing entity from repository`() {
repository.save(MyEntity(1, "name", "description"))
val result = service.findByMyId(1)
softly.assertThat(result?.id).isEqualTo(1)
softly.assertThat(result?.name).isEqualTo("name")
softly.assertThat(result?.description).isEqualTo("description")
}
Test failure
org.junit.ComparisonFailure:
Expected :"name"
Actual :null
改变失败findByMyId
方法的名称要么getByMyId
或retrieveByMyId
允许测试情况下从两个命令行和IDE成功通过。如果作为单个测试运行,测试总是可以从IDE工作,不管名称如何,但是当测试类作为整体运行时,它会失败。
我想知道使用findByXXId返回时的问题和实体,当我更改测试方法的名称以开始获取或检索时,这会起作用。如果我使用任何其他方法名称,它也会失败,甚至当我在其他服务和测试类中更改方法名称时,由于NPE,我看到失败。
如果这没有意义,我会事先道歉,但我是这个堆栈的新手,需要三天的时间才能确定这些测试在应用程序完美运行时失败的原因。
听起来像你的测试取决于其他测试,名称的变化影响测试的顺序。尝试在repository.save之后添加一个repository.flush并使用@Transactional注释测试 –
我尝试了这两个建议,但问题仍然存在。如果我将测试方法命名为findByXXXXId,它会失败,但如果我保持实现完全相同,并将其重命名为getByXXXXId或retrieveByXXXXId,则在执行整个测试类时测试会成功通过。 – hoos