14

異なるソースセットで Kotlin パッケージ関数とパッケージ プロパティを使用することは可能ですか? そうしようとしたら、NoSuchMethodError投げてしまいました。


Kotlinコードと2つのソースセットを含むGradleプロジェクトがありmaintest. ではmain、ファイルの 1 つに次のコードがあります。

package ru.ifmo.ctddev.igushkin.dkvs
...
public val payloadSplitter: String = " ### "

次のコードでtestアクセスしようとしています:payloadSplitter

package ru.ifmo.ctddev.igushkin.dkvs
...
public class MessageTests {
    ...
    test fun testParsing() {
        ...
        checkParseAndToString("p1b 345 ${payloadSplitter} set a b c")
    }
    ...
}

そして、正確にpayloadSplitterアクセスされる最初の行で、実行時に取得します

java.lang.NoSuchMethodError: ru.ifmo.ctddev.igushkin.dkvs.DkvsPackage.getPayloadSplitter()Ljava/lang/String;

他のグローバル変数と関数もtest同じエラーでアクセスできません。


UPD Kotlin チームがこの問題について説明し、こちらで修正を発表しました。

4

3 に答える 3

14

クラス外のプロパティとメソッドの場合、Kotlin は ${packagename}Package という名前の Java クラスを作成し、静的メソッドと変数として実装されたプロパティとメソッドを使用します。ソースセットが複数ある場合、Java クラスはソースセットごとに 1 回ずつ、合計 2 回作成されます。あなたの問題は、テストソースセットの「パッケージクラス」がメインソースセットでコンパイルされたクラスを隠していることです。

上記のコメントで述べたように、Kotlin コンパイラがテスト出力ディレクトリにこのパッケージ クラスを作成しないように、テスト ソースセットに最上位のプロパティまたはメソッドを含めないようにしてください。

于 2015-05-29T07:40:35.600 に答える
5

以前に提案されたことに加えて、別の回避策を見つけました: パッケージ レベルの関数またはプロパティが必要な場合testは、テスト ソースなどでテストを別のパッケージに移動します。

 package ru.ifmo.ctddev.igushkin.dkvs.tests

そして、する

 import ru.ifmo.ctddev.igushkin.dkvs.*

これはメインパッケージのすべてです。これにより、Kotlin コンパイラは競合しない 2 つの Package クラスを生成するため、両方ともグローバル メンバーを持つことができます。

于 2015-06-01T20:30:50.790 に答える