2019年3月10日日曜日

Kotlin メモ : File.outputStream(), OutputStream.writer()

fun File.outputStream(): FileOutputStream
fun OutputStream.writer(charset: Charset = Charsets.UTF_8): OutputStreamWriter
fun File.writer(charset: Charset = Charsets.UTF_8): OutputStreamWriter

val writer = OutputStreamWriter(FileOutputStream(file), charset) writer.write(...) writer.close() file.outputStream() .writer(charset) .use { it.write(...) } file.writer(charset) .use { it.write(...) }

2019年2月27日水曜日

ユースケースの理解を深めるために「ユースケース駆動開発実践ガイド」を読んでみた



話は twitter で FizzBuzz アンケートを取ったことに遡る。



なぜこんなアンケートを取ったかというと、DroidKaigi 2019 のあるセッションで「これが UseCase だ」と言っていたものを自分はそうは思わなかった(domain layer のロジックだと思った)からである。



いろんな人の意見を聞けてとてもよかった。



このアンケートを起点としたやりとりの中でユースケース図の話があり、



ユースケース図、およびユースケースについて理解を深めたかったで「ユースケース駆動開発実践ガイド」を読んでみた。

読んだ結果の理解は



「ユースケースはユーザーとシステムとの対話である」





現状、私は Clearn Architecture の UseCase は 依存方向を規定するたの構成レイヤーの一つと理解している。



2019年2月20日水曜日

Intent の equals 判定には filterEquals() を使う

val intent1 = Intent(Intent.ACTION_VIEW) val intent2 = Intent(Intent.ACTION_VIEW) これに対し assertThat(intent1).isEqualTo(intent2) // fail は失敗します。Intent で equals() は override されていません。

では Intent の比較はどうするかというと filterEquals() を使います assertThat(intent1.filterEquals(intent2)).isTrue() // success Intent の構成をチェックしたいだけなら IntentSubject を使うという方法もあります。 IntentSubject.assertThat(intent1).hasAction(Intent.ACTION_VIEW) // success


class Navigator(private val context: Context) { fun moveTo() { context.startActivity( Intent( Intent.ACTION_VIEW, Uri.parse("https://developer.android.com/") ) ) } } このクラスに対して context.startActivity() の呼び出しをチェックする以下のテストは失敗します。Intent の equals() が false になるからです。 val context = mock(Context::class.java) Navigator(context).moveTo() // fail verify(context).startActivity( Intent( Intent.ACTION_VIEW, Uri.parse("https://developer.android.com/") ) ) argThat を使って filterEquals() を使えば成功します。 val context = mock(Context::class.java) Navigator(context).moveTo() // success verify(context).startActivity(argThat { intent -> intent.filterEquals( Intent( Intent.ACTION_VIEW, Uri.parse("https://developer.android.com/") ) ) })