Saya belum pernah menggunakan layanan Grails sebelumnya, tetapi menurut pencarian Web saya, layanan tersebut dapat disuntikkan ke objek domain. Jadi, jika saya memiliki kelas domain berikut (asumsikan BookService
didefinisikan di suatu tempat),
class Book {
BookService bookService
}
ketika saya membuat instance objek Book
menggunakan, def book = new Book()
, book.bookService
harus disetel?
Jika demikian, bagaimana jika saya ingin memasukkan layanan eksternal (atau komponen mirip layanan)? Misalnya, jika ada klien API ISBN yang tersedia, dapatkah saya mengharapkan grail untuk menyuntikkannya dengan cara yang sama? Misalnya, kliennya adalah IsbnApi
, bagaimana cara saya menyuntikkan secara otomatis seperti layanan lain? Apakah kode di bawah ini akan berfungsi?
class Book {
@Transient
@Autowire
IsbnApi isbnApi
}
Berdasarkan tanggapan sebelumnya terhadap pertanyaan ini, saya telah mendefinisikan kelas domain dengan cara ini:
class Book {
static transients = ['isbnApi']
IsbnApi isbnApi
}
Sekarang, mungkin hanya ini yang saya perlukan, namun saya juga ingin menguji apakah injeksi otomatis akan berfungsi bahkan tanpa harus menjalankan aplikasi. Dalam pengujian unit saya, saya harus mengatur "layanan" tiruan secara manual.
IsbnApi isbnApi = Mock()
Book book = new Book()
book.isbnApi = mockIsbnApi
Saya mencoba memeriksa injeksi otomatis dengan memindahkan pengujian ke test/integration
dan mengatur kacang menggunakan doWithSpring
.
def doWithSpring() {
isbnApi = (InstanceFactoryBean, mockIsbnApi, isbnApi)
}
void "test automatic injection"() {
given:
IsbnApi isbnApi = Mock()
Book book = new Book()
//removed: book.isbnApi = mockIsbnApi
expect:
book.isbnApi //this fails
}
Saya juga menemukan informasi tambahan dari jawaban untuk pertanyaan serupa. Secara khusus,
Perhatikan bahwa karena Anda menggunakan 'def' Anda tidak perlu menambahkannya ke daftar transien. Apakah Anda mencoba mengaksesnya dari metode statis? Ini adalah kolom instance, jadi Anda hanya dapat mengaksesnya dari instance.
src/groovy
, atau dari toples lain, dll. - person Psycho Punch   schedule 22.09.2014