2017-06-20 15 views
1

AccountsRepository-Test @Autowired JpaRepository in spock

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 gibt mir O in gegeben und Block erwarten. Ich habe das manuell getestet und es ist die Rückkehr nicht Null, da die Tabelle Einträge hat. Wie man das in spock richtig testet

Antwort

2

Spock Mocks funktionieren nicht, wenn sie als @Shared definiert sind, aber das ist nicht Ihr Problem hier. Ihnen fehlt die @ContextConfiguration oder @SpringBootTest Annotation, so dass die Feder tatsächlich verwendet wird und die Bohne injizieren kann. Stellen Sie außerdem sicher, dass die spock-spring-Abhängigkeit vom Klassenpfad besteht.

Als Randbemerkung, können Sie auch

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

zu sagen, dass der Eintrag Zahl erhöht haben sollte verwenden.

1

Das Problem ist, dass Sie nicht mit dem Repository interagieren, sondern mit einem Mock interagieren.

In der SetupSpec ersetzen Sie das injizierte Repository durch einen Schein, der standardmäßig 0 zurückgibt, wenn er mit seiner Zählmethode interagiert. Entfernen Sie den setupSpec-Teil, um mit dem real injizierten Repository zu interagieren.

+0

gute Erklärung. Wenn ich versuche, es in den setupSpec-Blöcken zu entfernen, wird accountRepository jedoch null –

Verwandte Themen