2015-03-23 2 views
0

Я пытаюсь выполнить модульный тест методом, когда объект с составным ключом вставляется в базу данных. Всякий раз, когда я запускаю свой модульный тест для этого, я получаю следующее.Тестирование модулей Grails с составными ключами

Failure: | 
testTransaction(com.myapp.foo.TestServiceSpec) 
| 
Condition not satisfied: 

Transaction.count() == 1 
      |  | 
      0  false 

    at com.myapp.foo.TestServiceSpec.testTransaction(TestServiceSpec.groovy:166) 

Если я удалю составной код ключа и ничего другого из своего класса домена, тест пройдет.

Это мой домен класса, Transaction.groovy:

class Transaction implements Serializable { 
    String timestamp 
    String source 
    String tableName 
    String fieldName 
    Integer changeNumber 
    String fieldValue 
    String objectId 

    static mapping = { 
     id composite: ["timestamp", "source", "tableName", "fieldName", "changeNumber"], generator: 'assigned' 
    } 

    boolean equals(other) { 
     if (!(other instanceof Transaction)) { 
      return false 
     } 

     other.timestamp == timestamp && other.source == source && other.id == id && other.tableName == tableName && other.fieldName == fieldName && other.changeNumber == changeNumber 
    } 

    int hashCode() { 
     def builder = new HashCodeBuilder() 
     builder.append timestamp 
     builder.append source 
     builder.append tableName 
     builder.append fieldName 
     builder.append changeNumber 
     builder.toHashCode() 
    } 
} 

Это код, который испытывается:

def response = [code: 'OK'] 
def transaction = new Transaction() 

transaction.timestamp = (new Date()).format("yyyy-MM-dd HH:mm:ss.SSS") 
transaction.source  = "APP" 
transaction.tableName = "TABLE_NAME" 
transaction.fieldName = "FIELD_NAME" 
transaction.fieldValue = "FIELD_VALUE" 
transaction.objectId  = "OBJECT_ID" 

def changeNumber = Transaction.createCriteria().get { 
    eq("objid", currentTransaction.objid) 
    eq("tableName", currentTransaction.tableName) 
    projections { 
     max("changeNumber") 
    } 
} 

currentTransaction.changeNumber = (changeNumber ?: 0) + 1 

if(!transaction.save()) { 
    transaction.errors.each { 
     println it 
    } 

    response = [code: 'error transaction', status: 500] 
} 

return response 

И, наконец, вот мой блок кода тест:

void testTransaction() { 
    when: 
    def response = testService.loadTransaction() // Creates transaction row 

    then: 
    assert response == [code: 'OK'] 
    assert Transaction.count() == 1 
} 

Доменная структура была определена другой стороной, и я не могу ее каким-либо образом изменить, поэтому составной ключ является mu ул. К сожалению, многие классы в этом приложении используют составные ключи, поэтому, если я не могу их протестировать, многие из моих кодов не могут быть охвачены модульным тестированием. Любая информация, чтобы заставить меня двигаться в правильном направлении, была бы замечательной.

ответ

2

Не используйте модульные испытания для проверки настойчивости.

Модульные тесты имеют реализацию GORM, но она не поддерживается базой данных, только ConcurrentHashMap. Это довольно хорошо, но его следует использовать только когда-либо, чтобы избежать необходимости издеваться над уровнем устойчивости при модульном тестировании других типов артефактов, таких как контроллеры. Если вы хотите проверить настойчивость, используйте базу данных.

В противном случае вы увидите такие напуганные проблемы, как это, и подобные проблемы, такие как ложные негативы или худшие - ложные срабатывания, в которых проходит тест, который не должен, оставляя ошибки в вашем «проверенном» коде.

Смежные вопросы