テストで解決。
import android.content.Context
import android.content.res.XmlResourceParser
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.platform.app.InstrumentationRegistry
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.xmlpull.v1.XmlPullParser
@RunWith(AndroidJUnit4::class)
class RemoteConfigTest {
private lateinit var defaultXmlParser: XmlResourceParser
@Before
fun setUp() {
val context: Context = InstrumentationRegistry.getInstrumentation().targetContext
defaultXmlParser = context.resources.getXml(R.xml.remote_config_defaults)
}
@Test
fun assertAllKeysHaveDefaultValues() {
// デフォルト値が定義されているkeyを取り出す
val keysWithDefaults: MutableSet<String> = mutableSetOf()
while (defaultXmlParser.eventType != XmlPullParser.END_DOCUMENT) {
if (defaultXmlParser.eventType == XmlPullParser.START_TAG && defaultXmlParser.name == "key") {
defaultXmlParser.next()
keysWithDefaults.add(defaultXmlParser.text)
}
defaultXmlParser.next()
}
// デフォルト値が定義されていないkeyを取り出す
val keysWithoutDefaults: Set<String> = RemoteConfigManager.keys() - keysWithDefaults
// デフォルト値が定義されていないkeyがなければ終了
if (keysWithoutDefaults.isEmpty()) return
throw IllegalStateException(
"""keyに対応するデフォルト値が存在しない:${keysWithoutDefaults.joinToString(separator = ", ")}"""
)
}
}
XmlPullParser
の代わりにXPath
を使うともっとすっきり書けるかもしれない。。