与Kotlin的Mockito:AbstractMethodError

我正在努力使谷歌的测试实验室代码示例与kotlin一起工作。 但转换后,我想嘲笑kotlin接口我得到一个AbstractMethodError ,我无法解决。

的build.gradle:

 testCompile "org.hamcrest:hamcrest-all:1.3" testCompile "junit:junit:4.12" testCompile "org.mockito:mockito-core:2.8.47" testCompile "org.powermock:powermock-module-junit4:1.6.2" testCompile "org.powermock:powermock-api-mockito:1.6.2" 

NotesPresenterTest.kt

  package com.example.android.testing.notes.notes import org.mockito.Matchers.any /** * Unit tests for the implementation of [NotesPresenter] */ class NotesPresenterTest { @Mock private val mNotesView: NotesContract.View? = null @Before fun setupNotesPresenter() { MockitoAnnotations.initMocks(this) // Get a reference to the class under test mNotesPresenter = NotesPresenter(mNotesRepository!!, mNotesView!!) } @Test fun clickOnFab_ShowsAddsNoteUi() { // // When adding a new note mNotesPresenter!!.addNewNote() // // // Then add note UI is shown verify<NotesContract.View>(mNotesView).showAddNote() } @Test fun clickOnNote_ShowsDetailUi() { // Given a stubbed note val requestedNote = Note("Details Requested", "For this note") // When open note details is requested mNotesPresenter!!.openNoteDetails(requestedNote) // Then note detail UI is shown verify<NotesContract.View>(mNotesView).showNoteDetailUi(any()) } companion object { private val NOTES = Lists.newArrayList(Note("Title1", "Description1"), Note("Title2", "Description2")) private val EMPTY_NOTES = ArrayList<Note>(0) } } 

NotesContract.java

 public interface NotesContract { interface View { void setProgressIndicator(boolean active); void showNotes(List<Note> notes); void showAddNote(); void showNoteDetailUi(String noteId); } interface UserActionsListener { void loadNotes(boolean forceUpdate); void addNewNote(); void openNoteDetails(@NonNull Note requestedNote); } } 

在这里,将NotesContract转换为kotlin后,我得到了下一个错误:

java.lang.IllegalStateException:any()在com.example.android.testing.notes.notes.NotesPresenterTest.clickOnNote_ShowsDetailUi(NotesPresenterTest.kt:98)上不能为null。

所以我加了Mockito-Kotlin来解决它。

 testCompile ("com.nhaarman:mockito-kotlin:0.9.0", { exclude group: 'org.jetbrains.kotlin', module: 'kotlin-stdlib' }) 

它解决了以前,但与另一个错误运行:

java.lang.AbstractMethodError:org.powermock.api.mockito.internal.mockmaker.PowerMockMaker.isTypeMockable(Ljava / lang / Class;)Lorg / mockito / plugins / MockMaker $ TypeMockability;

在org.mockito.internal.util.MockUtil.typeMockabilityOf(MockUtil.java:29)at org.mockito.internal.util.MockCreationValidator.validateType(MockCreationValidator.java:22)at org.mockito.internal.creation.MockSettingsImpl.validatedSettings (MockSettingsImpl.java:186)在org.mockito.internal.creation.MockSettingsImpl.confirm(MockSettingsImpl.java:180)在org.mockito.internal.MockitoCore.mock(MockitoCore.java:62)在org.mockito.Mockito。在org.mockito.internal.configuration.MockAnnotationProcessor.process(MockAnnotationProcessor.java:16)的org.mockito.internal.configuration.MockAnnotationProcessor.process(MockAnnotationProcessor.java:33)上模拟(Mockito.java:1729) .internal.configuration.IndependentAnnotationEngine.createMockFor(IndependentAnnotationEngine.java:38)at org.mockito.internal.configuration.IndependentAnnotationEngine.process(IndependentAnnotationEngine.java:62)at org.mockito.internal.configuration.InjectingAnnotationEngine.processIndependentAnnotations(InjectingAnnot ationEngine.java:57)at org.mockito.internal.configuration.InjectingAnnotationEngine.process(InjectingAnnotationEngine.java:41)at org.mockito.MockitoAnnotations.initMocks(MockitoAnnotations.java:69)at com.example.android.testing.notes .notes.NotesPresenterTest.setupNotesPresenter(NotesPresenterTest.kt:58)

任何想法如何解决这个问题?

看起来Mockito和PowerMock不能很好地协同工作。 所以依赖关系应该是:

 testCompile "org.mockito:mockito-core:2.8.47" testCompile ("com.nhaarman:mockito-kotlin:0.9.0", { exclude group: 'org.jetbrains.kotlin', module: 'kotlin-stdlib' }) 

或者,如果您想使用PowerMock和JUnit 4.0-4.3:

 testCompile ("com.nhaarman:mockito-kotlin:0.9.0", { exclude group: 'org.jetbrains.kotlin', module: 'kotlin-stdlib' }) testCompile "org.powermock:powermock-module-junit4-legacy:$rootProject.ext.powerMockito" testCompile "org.powermock:powermock-api-mockito2:$rootProject.ext.powerMockito"