シンプルな Customer + PawordReset データモデルがあります。
私の PasswordService では、 PasswordReset.findByUsername() と save() を呼び出し、正常に動作します。
次に、@Mock([Customer, PasswordReset]) を持つ PasswordServiceTests を作成しました。そのテストでは、新しい Customer オブジェクトを作成し、Customer.save を使用して PasswordReset.findByUsername() を使用します。どちらも正常に動作します。
Customer.findByUsername() と PasswordReset.save() の両方を正常に使用するテスト コール service.initatePasswordReset() (PasswordService)。
テストでは、PasswordReset.findByUsername(...) を呼び出して、service.initiateReset() によって作成されたオブジェクトを見つけます。
しかし、別のメソッドを呼び出すと、service.performReset() は、Customer.findByUsername(..) を使用して顧客オブジェクトを正常にロードし、顧客パスワード フィールドを変更し、customer.save() を実行しようとします。
次のエラーは、PasswordService の customer.save() が原因で発生します。誰が何が悪いのか教えてもらえますか?
java.lang.IndexOutOfBoundsException: インデックス: 1、サイズ: 1 at java.util.ArrayList.rangeCheck(ArrayList.java:604) at java.util.ArrayList.remove(ArrayList.java:445) at org.grails.datastore. mapping.simple.engine.SimpleMapEntityPersister$1.deindex(SimpleMapEntityPersister.groovy:101) org.grails.datastore.mapping.engine.NativeEntryEntityPersister.updatePropertyIndices(NativeEntryEntityPersister.java:1200) org.grails.datastore.mapping.engine.NativeEntryEntityPersister .access$100(NativeEntryEntityPersister.java:55) org.grails.datastore.mapping.engine.NativeEntryEntityPersister$4.run(NativeEntryEntityPersister.java:958) org.grails.datastore.mapping.core.impl.PendingOperationExecution.executePendingOperation(PendingOperationExecution) .java:36) org.grails.datastore.mapping.core.AbstractSession で。org.grails.datastore.mapping.core.AbstractSession.flushPendingUpdates(AbstractSession.java:302) の flushPendingOperations(AbstractSession.java:323) org.grails.datastore.mapping.core.AbstractSession.flush(AbstractSession.java:240) のorg.grails.datastore.gorm.GormInstanceApi.doSave(GormInstanceApi.groovy:168) で org.grails.datastore.gorm.GormInstanceApi$_save_closure4.doCall(GormInstanceApi.groovy:143) で org.grails.datastore.mapping.core .DatastoreUtils.execute(DatastoreUtils.java:301) で org.grails.datastore.gorm.AbstractDatastoreApi.execute(AbstractDatastoreApi.groovy:34) で org.grails.datastore.gorm.GormInstanceApi.save(GormInstanceApi.groovy:142) でcom.foo.services.PasswordService.performPasswordReset(PasswordService.groovy:33) com.foo.services.PasswordServiceTests で。testResetPassword(PasswordServiceTests.groovy:47)
PasswordServiceTest.groovy
@TestFor(PasswordService)
@Mock([Customer, PasswordReset])
class PasswordServiceTests {
void setUp() {
mockCodec(MD5Codec)
// mockService(CustomerRegistrationService)
}
void testResetPassword() {
Customer c = CustomerRegistrationServiceTests.makePrivateCustomer()
c.sumUnpaidInvoices = 0
c.sumOverdueInvoices = 0
c.password = service.hashPassword(c)
c.customerType = CustomerType.NormalCustomer.value
c.save(flush: true);
assertEquals("Mock DB does not contain 1 customer", 1, Customer.list().size())
service.initiatePasswordReset(c.username)
def pwReset = PasswordReset.findByUsername(c.username)
println("psreset saved: " + pwReset.username + " / " + pwReset.code)
assertEquals(c.username, pwReset.username)
service.performPasswordReset(c.username, "test"); // CALLS METHOD BELOW
}
}
PasswordService.groovy のメソッド:
def performPasswordReset(String username, String newPassword) {
Customer customer = Customer.findByUsername(username)
if(customer != null) {
customer.password = newPassword;
customer.password = hashPassword(customer);
customer.save(flush: true); // CAUSES THE ERROR
....
}
}