@kotlin_lang

Страница 344 из 982
Beholder
24.09.2017
11:06:14
а как сделать чтобы подставлял хоть что то?
А некоторых в Java наоборот раздражает эти параметры вручную удалять, потому что они обычно и так понятно про что

Konstantin
24.09.2017
12:07:47
То есть я правильно понимаю что не будут автоматически генериться комментарии? Или я настроил что то не правильно?

Nikita
24.09.2017
13:43:35
Подскажите пожалуйста как можно вызвать лямбда функцию метода замоканного класса? Есть класс который вызывает метод с лямба функциями в качестве аргумента метод другого класса, как тестировать такое поведение?

Google
Руслан
24.09.2017
13:44:49
Я вот три раза вопрос перечитал и не понял что нужно замокать, можно простейший пример?

Nikita
24.09.2017
13:45:00
конечн

ща

https://gist.github.com/abbath0767/938df8c96bfe529f5cc27e0916a22ce2

есть класс A который содержит ссылку на класс Б, который имеет методы, принимающие в качестве аргументов лямбда функции. Как можно замокать (mockito) класс/метод класса B таким образом что бы вызывалась определенная функция

Руслан
24.09.2017
14:00:00
Ну видимо для начала нужно знать что в котлине все классы по умолчанию final

Nikita
24.09.2017
14:00:04
ну вот банально

в гисте лучше представлю

https://gist.github.com/abbath0767/d7040c35e797b0a172fd02439097b6eb

Руслан
24.09.2017
14:16:50
class A { fun callA() { } } class B(val a: A) { fun callB() { a.callA() } } т.е. ты мокаешь метод B#callB, и при этом ты хочешь чтобы он вызывал A#callA?

Nikita
24.09.2017
14:19:06
Похоже на то, только у метода callB в качестве аргумента лябмда функция, реализацией которой заботися А

и кто угодно вообще вызывающий этот метод

Google
Руслан
24.09.2017
14:21:27
т.е. у тебя B принимает A и при этом почему-то лямбда как-то из A прилетает?

Nikita
24.09.2017
14:21:43
нет, B не принимает А

Руслан
24.09.2017
14:21:45
Если так, но нужно распутывать архитектуру

Nikita
24.09.2017
14:22:07
B принимает лямбда функции в качестве аргументов метода

Руслан
24.09.2017
14:22:19
Вот смотри, выше я нарисовал минимальный пример, которым пытался объяснить твою проблему

И он компилится, если вставить в IDE :)

Nikita
24.09.2017
14:22:44
Ну так это не моя же проблема

Руслан
24.09.2017
14:22:49
Если ты сделаешь такой пример, то думаю куда проще будет тебе помочь

Nikita
24.09.2017
14:23:29
class A(val b: B ) { fun callA(value : Int) { b.callB(value,{ println("value == 0!!!") }) } } class B() { fun callB(value: Int, result: (Unit) -> Unit) { if (value == 0) result.invoke(Unit) } }

скорее вот так

поправил, но в итоге пришел к 1 примеру из гиста.

Руслан
24.09.2017
14:26:55
int == 0 —> value == 0

что тестировать будем? A, B?

Nikita
24.09.2017
14:27:14
А

Если бы я хотел тестировать непосредственно B, таких проблем бы не возникло, тут именно интересует каким образом замокать объект B таким образом что бы вызывалась та или иная лямбда того или иного метода. Так как тестировнаие внутренней логики B подразумевает так жо моканье внутренних объектов, а это уже будет в тестировании самого объекта B

Руслан
24.09.2017
14:29:04
значит я мокаю B, передаю в A и проверяю что B был вызван как я предпологал

когда я делаю вызов callA

Nikita
24.09.2017
14:30:09
когда я делаю вызов callA
вызывается определенная лямбда метода callB (просто в оригинале их там больше чем одна)

Руслан
24.09.2017
14:30:43
т.е. тебе нужно замокать лямбду

чтобы проверить что она была вызвана

Google
Nikita
24.09.2017
14:31:03
ну то есть например есть отдельная лямбда (String) - (Unit) которая например в случае value != 0 возвращает, например, значение value

Руслан
24.09.2017
14:32:32
я вот не знаю точно как на мокито замокать лямбду

Nikita
24.09.2017
14:32:43
возможно, если это означает что появится возможность вызывать определенную лямбду у замоканного класса B в случае вызова метода в которые эти сами лямбды передаются

Руслан
24.09.2017
14:32:47
но всегда можно подсунуть свою

Nikita
24.09.2017
14:33:24
но всегда можно подсунуть свою
можно, но тогда выходит конструкция наподобие такой:

when`(deviceInteractor.reserveBadCaseDevice( workerId, DeviceCondition.LOST, { println("WHATS NEED") }, { println("DONT NEED") }, { println("DONT NEED") })).////then...?

то есть мне надо как то определить поведение замоканного объекта при вызове метода, аргументами которого является лямбда. И тут мне нужно замокать так что бы при выхове метода reserveBadCaseDevice вызывалась лямбда первая из списка

так как в тестируемом классе именно вызов 1 лямбды определяет дальнейшее поведление и оно собственно и проверяется

Хекс
24.09.2017
15:42:36
Добрый день. По андрюхе здесь тоже можно советоваться?

You
24.09.2017
15:43:46
Ну если с котлином связано, то почему нет?

Хекс
24.09.2017
15:46:49
да, с котлином. в андроиде уже ответили)

Спрошу всё-таки Как тут можно улучшить код? package com.hexakosioihexekontahex.ion.authentication import android.os.Bundle import android.support.v7.app.AppCompatActivity import android.widget.Button import android.widget.EditText import android.widget.ImageView class MainActivity : AppCompatActivity() { var img: ImageView? = null var btn: Button? = null var email: EditText? = null var pass: EditText? = null val email_txt: String = "123@gmail.com" val pass_txt: String = "123" override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) login() } fun login(){ img = findViewById(R.id.imageView2) as ImageView? btn = findViewById(R.id.button) as Button? email = findViewById(R.id.editText) as EditText? pass = findViewById(R.id.editText2) as EditText? btn!!.setOnClickListener { when { ((email!!.text.toString()).equals(email_txt) && (pass!!.text.toString()).equals(pass_txt)) -> img!!.setImageResource(R.drawable.unlocked) else -> img!!.setImageResource(R.drawable.wrong) } } } }

Хекс
24.09.2017
16:14:59
Залить его на pastebin для начала ?
Типа ссылкой кидать просто?

https://pastebin.com/EaJLKAnh

? animufag ?
24.09.2017
16:17:29
android extensions

? animufag ?
24.09.2017
16:18:06
equals в котлине можно не использовать

Хекс
24.09.2017
16:18:09
Во! Точно. Спасибо!

Google
Igor
24.09.2017
16:18:41
Кстати, да. Тебе IDEA про equals разве не показала ворнинги?

? animufag ?
24.09.2017
16:19:18
when здесь читаемости не добавляет

You
24.09.2017
16:20:00
Можно ещё не называть переменные email_txt

Михаил
24.09.2017
16:20:11
Типа ссылкой кидать просто?
Да. Из телеги смотреть крайне неудобно)

? animufag ?
24.09.2017
16:20:24
setImageResource скорее всего можно заменить на проперти imageResource хотя такие трюки зачастую ломаются тк нужно использовать support lib

Хекс
24.09.2017
16:20:26
Кстати, да. Тебе IDEA про equals разве не показала ворнинги?
Показывала, только говорила что со стрингами низя

You
24.09.2017
16:20:48
И почему метод login назван именно так?

Хекс
24.09.2017
16:21:07
И почему метод login назван именно так?
Потому что просто тренюсь

You
24.09.2017
16:21:25
Ну тренься сразу на будущее

Хекс
24.09.2017
16:22:18
Igor
24.09.2017
16:22:41
Хотя бы замени все: var img: ImageView? = null на: lateinit var img: ImageView что бы глаза твои !! не мозолили
Кстати, (если не юзать android extensions) var img: ImageView? = null можно еще заменить на val img by lazy { findViewById(R.id.imageView2) as ImageView }

Хекс
24.09.2017
16:23:36
теперь лучше https://pastebin.com/Hdirxmhw

DarkMentat
24.09.2017
16:23:45
можно типы не указывать, если сразу ясно, тоесть не val a: String = "ololo", а просто val a = "ololo"

плюс для nullов изначальных я делаю всякие fun nullString(): String? = null

и тоже нак иничю, типа val a = nullString()

имхо меньше шума

то громадное условие я бы в функцию вынес

DarkMentat
24.09.2017
16:26:08
img = findViewById(R.id.imageView2) as? ImageView ?: return

можно так кастить

Google
DarkMentat
24.09.2017
16:26:35
тогда и сплошных !! не будет

хотя лучше findViewById(R.id.imageView2) as? ImageView ?: throw RuntimeException("wrong layout")

смысл в nullability котлина в том, что нулл или абсолютно валидное состояние проги, или абсолютно невалидное

и это отражено в типах

если валидное - юзаем btn?.setOnClickListener { ... }

если нет - падаем как можно раньше, шлем что упали в крэшлитику, перезапускаемся

Maxim
24.09.2017
16:31:04
? animufag ?
24.09.2017
16:32:04


немного надоедают эти варнинги

Igor
24.09.2017
16:36:03
а от чего ж его не юзать то? есть какие то противопоказания?
Нет, разве если кто-то не любит “компиляторную магию”.

Maxim
24.09.2017
16:43:23
2. Это ещё почему?
потому что в !! смысла чуть менее чем никакого

Igor
24.09.2017
16:44:41
Лучше уж оно упадет, чем неправильно отработает

Maxim
24.09.2017
16:45:09
Каст в, например, Button? подразумевает, что button может не быть.
Какой каст? Зачем? kotlin extension выдаст объект того класса который описан в xml

Лучше уж оно упадет, чем неправильно отработает
Ну, тогда null safety в котлине - не фича, а баг

Igor
24.09.2017
16:46:28
Все к месту должно быть, а то так можно и лоб расшибить. Конкретно в этом примере будет null, то это явно НЕпредвиденное ошибка, а не часть бизнес-логики.

Страница 344 из 982