0

我有一个简单的 Customer + PaswordReset 数据模型。

在我的 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 在 java.util.ArrayList.rangeCheck(ArrayList.java:604) 在 java.util.ArrayList.remove(ArrayList.java:445) 在 org.grails.datastore。 mapping.simple.engine.SimpleMapEntityPersister$1.deindex(SimpleMapEntityPersister.groovy:101) at org.grails.datastore.mapping.engine.NativeEntryEntityPersister.updatePropertyIndi​​ces(NativeEntryEntityPersister.java:1200) at org.grails.datastore.mapping.engine.NativeEntryEntityPersister org.grails.datastore.mapping.engine.NativeEntryEntityPersister 的 .access$100(NativeEntryEntityPersister.java:55)$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 回答