0

シンプルな 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.updatePropertyIndi​​ces(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
        ....
    }
}
4

2 に答える 2

2

サービスで customer.save() への呼び出しを削除することでこの問題を修正しました。これは必須ではなく、customer.save がなくても、パスワードを変更すると自動的にデータベースに保存されます (customer.password = "foo")。

于 2012-06-13T13:46:18.987 に答える
0

この特定のエラーは実際には関係ないようです

customer.save(flush: true);

休止状態には、永続化する必要がある何か他のもの (以前の「非フラッシュ保存」) があり、それは失敗すると思います。

于 2012-06-13T13:45:52.293 に答える