在 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 在 given 和 expect 块中给我 O。我手动测试了它,它 return 是非零的,因为它 table 有条目。如何在 spock
中正确测试
问题在于,您不是与存储库交互,而是与模拟交互。
在 setupSpec 中,您将用模拟替换注入的存储库,在与其计数方法交互时,模拟默认为 return 0。删除 setupSpec 部分以与真正注入的存储库交互。
Spock 模拟在定义为 @Shared
时不起作用,但这不是您的问题。您缺少 @ContextConfiguration
或 @SpringBootTest
注释,因此实际上使用了 spring 并且可以注入 bean。还要确保对类路径具有 spock-spring
依赖性。
作为旁注,您也可以使用
expect:
accountRepository.count() == old(accountRepository.count()) + 1
说条目数应该增加了。
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 在 given 和 expect 块中给我 O。我手动测试了它,它 return 是非零的,因为它 table 有条目。如何在 spock
中正确测试问题在于,您不是与存储库交互,而是与模拟交互。
在 setupSpec 中,您将用模拟替换注入的存储库,在与其计数方法交互时,模拟默认为 return 0。删除 setupSpec 部分以与真正注入的存储库交互。
Spock 模拟在定义为 @Shared
时不起作用,但这不是您的问题。您缺少 @ContextConfiguration
或 @SpringBootTest
注释,因此实际上使用了 spring 并且可以注入 bean。还要确保对类路径具有 spock-spring
依赖性。
作为旁注,您也可以使用
expect:
accountRepository.count() == old(accountRepository.count()) + 1
说条目数应该增加了。