У меня возникли проблемы с пониманием того, что Котлин на самом деле делает:Котлин: изменения, внесенные в супер конструктор перезаписываются
Мой модульного тестирования выглядит следующим образом:
@Test
fun testReadCursorRequest() {
val xml = fromFile()
val parser: ReadCursorRequestParser = ReadCursorRequestParser(xml)
assertEquals(0, parser.status)
assertEquals(134, parser.contacts!!.size)
}
Мой анализатор выглядит следующим образом
abstract class EnvelopeParser(val xml: String) {
abstract fun parseResponse(response: Element)
init {
parseResponse(xmlFromString(xml))
}
// non-related stuff
}
class ReadCursorRequestParser(xml: String) : EnvelopeParser(xml) {
var contacts: List<AddressBookElementParser> = mutableListOf()
override fun parseResponse(response: Element) {
// here some parsing stuff, fills the contacts-list
println("size is: ${contacts.size}")
}
}
println говорит size is: 134
, в модульном тесте говорится: java.lang.AssertionError: Expected <134>, actual <0>
.
Почему?
Внутри парсинга есть ли локальная переменная с именем 'contacts'? Если есть, то его размер печатается, а не размер 'контактов', хранящихся в свойстве. – hotkey
Кроме того, ваш тест, похоже, не вызывает 'parseResponse()'. Где он (или должен быть) вызван? – hotkey
Прошу прощения, если это было непонятно из-за того, что я просто пропустил из этой записи здесь, я хотел сохранить как можно более короткие и контекстно-зависимые. EnvelopeParser фактически вызывает parseResponse от своего конструктора. Фактически, я запускаю это в режиме отладки с точками останова, поэтому на 100% уверены, что локальных переменных контактов нет, IntelliJ отображает значение члена контакта при разбиении на println. –