答えて
オブジェクトを任意の模擬ライブラリでモックできます。ここではJUnitの+ Mockito + Mockito-Kotlinの例:
import com.nhaarman.mockito_kotlin.mock
import com.nhaarman.mockito_kotlin.whenever
import org.junit.Assert.assertEquals
import org.junit.Test
object SomeObject : SomeInterface {
override fun someFun():String {
return ""
}
}
interface SomeInterface {
fun someFun():String
}
class SampleTest {
@Test
fun test_with_mock() {
val mock = mock<SomeInterface>()
whenever(mock.someFun()).thenReturn("42")
val answer = mock.someFun()
assertEquals("42", answer)
}
}
またはケースであなたがcallerFun
内SomeObject
を模擬したい場合:
import com.nhaarman.mockito_kotlin.mock
import com.nhaarman.mockito_kotlin.whenever
import org.junit.Assert.assertEquals
import org.junit.Test
object SomeObject : SomeInterface {
override fun someFun():String {
return ""
}
}
class Caller(val someInterface: SomeInterface) {
fun callerFun():String {
return "Test ${someInterface.someFun()}"
}
}
// Example of use
val test = Caller(SomeObject).callerFun()
interface SomeInterface {
fun someFun():String
}
class SampleTest {
@Test
fun test_with_mock() {
val mock = mock<SomeInterface>()
val caller = Caller(mock)
whenever(mock.someFun()).thenReturn("42")
val answer = caller.callerFun()
assertEquals("Test 42", answer)
}
}
バイトコードを操作するのは簡単ではありませんが、コードを変更することができない限り、答えは「いいえ」です。 のSomeObject.someFun()
への呼び出しを模擬する最も簡単な方法(と私がお勧めする方法)は、模擬オブジェクトを滑らせる何らかの方法を提供することです。
object SomeObject {
fun someFun() {}
}
fun callerFun() {
_callerFun { SomeObject.someFun() }
}
internal inline fun _callerFun(caller:() -> Unit) {
caller()
}
ここでのアイデアは、変更したいことを変更することです。上記のようにシングルトンに作用するシングルトンとトップレベル関数を必要としているのであれば、上で示したように、パブリックシグネチャを変更せずにトップレベル関数をテスト可能にする方法は、実装をinternal
関数に移すことですモックを滑らせることができます。
Kotlinのための非常に素晴らしい新しいモックライブラリがあります。それはMockkと呼ばれています。
これは今日のバージョン1.7にアップデートされ、あなたが望むのとまったく同じ方法でオブジェクトをモックすることができます。
それはドキュメントだの通り:
オブジェクトは、道以下のモックに変換することができる。
object MockObj {
fun add(a: Int, b: Int) = a + b
}
objectMockk(MockObj).use {
assertEquals(3, MockObj.add(1, 2))
every { MockObj.add(1, 2) } returns 55
assertEquals(55, MockObj.add(1, 2))
}
Kotlin言語の制限にもかかわらず、あなたがいる場合、オブジェクトの新しいインスタンスを作成することができますテストロジックには次のものが必要です。
val newObjectMock = mockk<MockObj>()
クラス代理人を使用して、余分なライブラリを使わずにObjectをモックできます。ここで
は私の提案は、あなたがそれ以外の場合は、それが実際の実装だ使用しますが、動作を変更しますデリゲートオブジェクトを設定することができ、あなたのテストでは
val someObjectDelegate : SomeInterface? = null
object SomeObject: by someObjectDelegate ?: SomeObjectImpl
object SomeObjectImpl : SomeInterface {
fun someFun() {
println("SomeObjectImpl someFun called")
}
}
interface SomeInterface {
fun someFun()
}
です。上記のコース名の
@Beofre
fun setUp() {
someObjectDelegate = object : SomeInterface {
fun someFun() {
println("Mocked function")
}
}
// Will call method from your delegate
SomeObject.someFun()
}
悪いですが、例のためには、目的を示しています。
SomeObjectが初期化された後、デリゲートがすべての関数を処理します。
公式で見つかることがありますdocumentation
- 1. のHello Worldは私が<code>Main.kt</code></p> <pre><code>package com.ahp.mui fun main(args: Array<String>) { println("...") println("Hello World") } </code></pre> <p>プロジェクトと呼ばれるKotlinファイルを持っている
- 2. Kotlin: "fun main(parameters:Array <String>)"のデフォルトのパラメータは、値を割り当てずに "guest"を出力する方法
- 3. 呼び出し可能<Object>呼び出し方法
- 4. Kotlin:シーケンス(コルーチン)をIterableとして渡す方法<T>
- 5. は、このコードで</p> <p><strong>にpermission.permissionName</strong></p> <p>を参照する方法はありKotlin
- 6. エルム -</p> <pre><code>a : Float </code></pre> <p>方法1が式を正しく</p> <pre><code>Mouse.x - a </code></pre> <p>を書くと考えるシグナルと数字
- 7. はそれを<code>inner</code>という名前<code>Type</code>考える
- 8. LINQを使用して、IList <IList <object>>をIList <object>に変換する方法は?
- 9. Kotlinでリスト<T>を初期化する方法は?
- 10. page_object要素のattribute_valueを取得する方法は?</p> <pre><code>the_image = @browser.image(:id, 'image01') </code></pre> <p>そのクラスの値を取得する方法が考えられます:</p> <pre><code>image_status = the_image.attribute_value('class') </code></pre> <p>[OK]を
- 11. Mock.Of <Object> VS Mock <Object>()
- 12. <img>と<object>
- 13. まず最初</strong>呼び出した後<strong>モックをリセットする方法(Mockito、JUnitの)
- 14. ユニットを返すKotlin関数をJavaで実装するときにUnit.INSTANCEを返さなければならないのはなぜですか?私はKotlin機能</p> <pre><code>fun f(cb: (Int) -> Unit) </code></pre> <p>を持っていると私は、Javaから<code>f</code>を呼び出したい場合は
- 15. Kotlin:</p> <pre><code>@OneOf(value = {"m", "f"}) </code></pre> <p>Kotlinの使用:Javaの注釈
- 16. Hibernate:マップを返す方法<String、List <Object>>
- 17. LinkedHashMapをKotlinの値でソートする方法は?私は</p> <pre><code>map.toSortedMap() </code></pre> <p>を使用することができます。しかしKotlinの値でのLinkedHashMapソートするための最良の方法は何であるのキーでソートするには
- 18. すべてを抽出する<object></object>
- 19. C#の - 私は同じクラスIは、<strong>setproblemから</strong>と<strong>NUM2</strong></strong>方法方法</strong> displayproblem <strong>に<strong>num1を呼び出したい
- 20. Redis max memoryの設定方法は?私configureを書く方法については考えている、</p> <pre><code>./redis-server <path>/redis.conf </code></pre> <p>しかし:
- 21. <TextInputに<を追加する方法。 <Back
- 22. DbFlow Kotlin and List <String>タイプコンバータ
- 23. Unity(C#) - > Kotlin < - Coroutines
- 24. Neo4J Webadminをリモートコントロールに開く方法は?方法はあり</p> <pre><code>example.com:7474 </code></pre> <p>:
- 25. List <Map <String、Object >>に値を追加する方法は?
- 26. Dictionary <string、Dictionary <string、object >>に項目を追加する方法は?
- 27. HashMap <String、List <Object>>プロパティをswagger ymlに定義する方法は?
- 28. Android:arraylist <object>をarraylist <element>に変換する便利な方法は?
- 29. <<使用を避ける方法 -
- 30. default_scopeをバイパスする方法は?私は、私は常に、現在のアカウントに基づいて結果を得る<code>User.all</code>を呼び出す場合</p> <p><code>default_scope where(account_id: Account.current_account.id)</code></p> <p>:
これはアンチパターンのようです...テストの目的でメインコードに余分なクラス/インターフェースを作成しないでください! – Kerooker
余分なクラスではなく、インターフェイスだけです。そして、これはJVMでのテストのベストプラクティスなので、これを実行する必要があります。 – IRus