Beholder
24.09.2017
11:06:14
Konstantin
24.09.2017
12:07:47
То есть я правильно понимаю что не будут автоматически генериться комментарии? Или я настроил что то не правильно?
Quantum Harmonizer
24.09.2017
13:18:48
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 таким образом что бы вызывалась определенная функция
balolam
24.09.2017
13:55:41
Руслан
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
Руслан
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:13:32
Dibro
24.09.2017
16:13:41
Хекс
24.09.2017
16:14:59
https://pastebin.com/EaJLKAnh
? animufag ?
24.09.2017
16:17:29
android extensions
Igor
24.09.2017
16:17:49
? 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
You
24.09.2017
16:20:48
И почему метод login назван именно так?
Хекс
24.09.2017
16:21:07
You
24.09.2017
16:21:25
Ну тренься сразу на будущее
Хекс
24.09.2017
16:22:18
Igor
24.09.2017
16:22:41
Хекс
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()
имхо меньше шума
то громадное условие я бы в функцию вынес
Хекс
24.09.2017
16:25:32
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:42:24
Quantum Harmonizer
24.09.2017
16:42:57
Maxim
24.09.2017
16:43:23
Quantum Harmonizer
24.09.2017
16:43:31
Igor
24.09.2017
16:44:41
Лучше уж оно упадет, чем неправильно отработает
Maxim
24.09.2017
16:45:09
Igor
24.09.2017
16:46:28
Все к месту должно быть, а то так можно и лоб расшибить.
Конкретно в этом примере будет null, то это явно НЕпредвиденное ошибка, а не часть бизнес-логики.