gpt4 book ai didi

java - DataJPATest Junit 方法命名和 NullPointerExceptions

转载 作者:行者123 更新时间:2023-12-02 12:01:25 26 4
gpt4 key购买 nike

我正在使用 SpringBoot/Kotlin/JPA/Hibernate/Junit 并拥有 JpaServiceTest 类来执行与单个实体相关的存储库方法。 JpaService 类的方法名称遵循约定 findByXXXXIdfindAllupdateXXXXaddXXXXdeleteXXXX.

为了保持一致性,我使用相同的约定命名 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 方法的名称更改为 getByMyIdretrieveByMyId 允许测试用例从命令行和 IDE 成功通过。如果作为单个测试运行,无论名称如何,该测试始终可以在 IDE 中运行,但当测试类作为整体运行时,它将失败。

我想知道使用 findByXXId 返回 Entity 的问题是什么,当我将测试方法的名称更改为以 get 或retrieve 开头时,这会起作用。如果我使用任何其他方法名称,它也会失败,而且,即使我更改其他服务和测试类中的方法名称,由于 NPE,我也会看到失败。

如果这没有意义,请提前道歉,但我是这个堆栈的新手,需要三天时间才能确定应用程序运行良好时这些测试失败的原因。

最佳答案

由于我在评论中的第一个建议似乎没有解决问题,因此这里列出了为了隔离问题而需要执行的操作。

首先要确保我了解了事实:

  • 您的测试在 IDE 中运行
  • 与所有其他测试(可能使用 Maven 或类似测试)一起运行时,您的测试失败
  • 您的测试在与所有其他测试一起运行时有效,但已重命名。

我从评论中得到的预感仍然成立:这与名称没有直接关系,而是与测试之间的相互依赖关系有关。

  1. 创建一个在 IDE 中重现问题的最小场景。

    a) 在 IDE 中运行所有测试(应该可以通过选择测试源文件夹并选择“运行测试”或其他内容来实现。

    b) 假设测试失败,通过选择树中越来越小的部分来缩小测试范围。

    c) 如果测试在 IDE 中完全没有失败,您可以使用 Maven 或任何其他受人尊敬的构建工具中的包含/排除来执行相同的操作。

    d) 另一个变体是创建一个包含所有测试的专用 TestSuite。

    一般来说,通过在每个步骤中删除大约一半的测试,您应该能够在合理的时间内得到包含两个测试的测试套件:有问题的测试和触发第一个失败的另一个测试。

  2. 激活 SQL 和事务处理的日志记录。

    第一次测试后您应该会看到回滚。接下来是第二次测试的插入。您不应该看到任何提交。

    如果您没有看到回滚,则说明您的测试未使用 @Transactional 进行注释,或者由于某种原因未获取事务。

    如果您没有看到插入内容,则您的更改似乎没有被刷新。

  3. 使用 JDBC 模板发出 select 语句来查看数据库的内容。使用诸如 select * from x 这样的简单语句。没有 where 子句,没有 join。记录结果。

有了这些信息,问题很可能对您来说变得显而易见。如果没有更新问题并对此答案发表评论。我再看一下。

关于java - DataJPATest Junit 方法命名和 NullPointerExceptions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47231456/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com