Android studio 在单元测试中处理protobuf类时出现NoSuchMethod错误

Android studio 在单元测试中处理protobuf类时出现NoSuchMethod错误,android-studio,kotlin,junit,protocol-buffers,protobuf-java,Android Studio,Kotlin,Junit,Protocol Buffers,Protobuf Java,我正在尝试使用protobuf模型编写类的单元测试,并在Android Studio中运行它们。 例如,这是一个简单的转换器测试 class UpdateConfigConverterTest { private val testable = UpdateConfigConverter() @Test fun `should convert from proto model`() { val url = "https://test.com"

我正在尝试使用protobuf模型编写类的单元测试,并在Android Studio中运行它们。
例如,这是一个简单的转换器测试

class UpdateConfigConverterTest {

    private val testable = UpdateConfigConverter()

    @Test
    fun `should convert from proto model`() {
        val url = "https://test.com"
        val availableVersion = 1
        val requiredVersion = 0
        val result = testable.convert(
            ProtoUpdateConfig.newBuilder()
                .setAvailable(availableVersion)
                .setRequired(requiredVersion)
                .setUrl("https://test.com")
                .build()
        )
        assertEquals(availableVersion, result.updateAvailableVersion)
        assertEquals(requiredVersion, result.updateRequiredVersion)
        assertEquals(url, result.url)
    }
}
测试类别:

internal typealias ProtoUpdateConfig = UpdateConfig
internal class UpdateConfigConverter {

    fun convert(source: ProtoUpdateConfig): UpdateConfig =
        UpdateConfig(
            updateAvailableVersion = source.available,
            updateRequiredVersion = source.required,
            url = source.url
        )
}
proto(实际上是内部消息,但对于flat是相同的):

android studio控制台输出:

java.lang.NoSuchMethodError:proto.api.response.ConfigAndroidOuterClass$ConfigAndroid$UpdateConfig.makeImmutable()V

位于proto.api.response.ConfigAndroidOuterClass$ConfigAndroid$UpdateConfig.(ConfigAndroidOuterClass.java:3130)
在com.anchorfree.eliteapi.convertertest.UpdateConfigConverterTest.should从原型转换(UpdateConfigConverterTest.kt:17)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:498)
位于org.junit.runners.model.FrameworkMethod$1.runReflectVeCall(FrameworkMethod.java:50)
位于org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
位于org.junit.runners.model.FrameworkMethod.invokeeexplosive(FrameworkMethod.java:47)
位于org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
位于org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
位于org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
位于org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
位于org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
位于org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
位于org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
访问org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
位于org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
位于org.junit.runners.ParentRunner.run(ParentRunner.java:363)
位于org.junit.runner.JUnitCore.run(JUnitCore.java:137)
位于com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
位于com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
位于com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
位于com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
尽管如此,
.gradlew/testDebugUnitTest
还是成功完成了。可能smth与AS配置等有误

Android Studio版本:3.6.0,在3.5.2中是相同的。
Protobuf lite:3.0.1.
Protobuf gradle插件:0.8.8

根据这篇文章,在Robolectric版本3.1+上使用Protobuf时可能会出现问题

通过执行以下操作,可以尝试从Robolectric中排除Protobuf依赖项:

testImplementation ('org.robolectric:robolectric:3.x.x') {
    exclude group: 'com.google.protobuf'
}

你试过检查依赖关系树吗?例如,Robolectric的一个已知问题也导致了NoSuchMethod错误@anshajkhare谢谢,事实就是这样!请发布一个答案,以便我可以奖励赏金,问题是protobuf与robolectric的依赖冲突
at proto.api.response.ConfigAndroidOuterClass$ConfigAndroid$UpdateConfig.<clinit>(ConfigAndroidOuterClass.java:3130)
at com.anchorfree.eliteapi.converters.UpdateConfigConverterTest.should convert from proto model(UpdateConfigConverterTest.kt:17)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
testImplementation ('org.robolectric:robolectric:3.x.x') {
    exclude group: 'com.google.protobuf'
}