在 spock 中测试 @Autowired JpaRepository

Test @Autowired JpaRepository in spock

AccountsRepository

public interface AccountsRepository extends JpaRepository<Account, Long> {}

AccountsEndpointTest

class AccountsEndpointTest extends Specification {
  @Shared @Autowired AccountsRepository accountRepository
  @Shared def entriesCount

  def setupSpec() {
     accountRepository = Mock()
  }

  def "create user"() {
    given: "the current number of rows in accounts table"
    entriesCount = accountRepository.count()

    when: "add endpoint is invoked"
    // send /user/add request

    expect: 
    entriesCount < accountRepository.count()

  }
}

entriesCount 在 givenexpect 块中给我 O。我手动测试了它,它 return 是非零的,因为它 table 有条目。如何在 spock

中正确测试

问题在于,您不是与存储库交互,而是与模拟交互。

在 setupSpec 中,您将用模拟替换注入的存储库,在与其计数方法交互时,模拟默认为 return 0。删除 setupSpec 部分以与真正注入的存储库交互。

Spock 模拟在定义为 @Shared 时不起作用,但这不是您的问题。您缺少 @ContextConfiguration@SpringBootTest 注释,因此实际上使用了 spring 并且可以注入 bean。还要确保对类路径具有 spock-spring 依赖性。

作为旁注,您也可以使用

expect: 
accountRepository.count() == old(accountRepository.count()) + 1

说条目数应该增加了。