Я использую последние версии JUnitParams, junit и mockito-all.
testCompile group: 'pl.pragmatists', name: 'JUnitParams', version: '1.1.1'
testCompile group: 'junit', name: 'junit', version: '4.12'
testCompile group: 'org.mockito', name: 'mockito-all', version: '2.0.2-beta'
Я продолжаю получать NoSuchMethodError при запуске теста JUnit с аннотацией @RunWith(MockitoJUnitRunner.class).
java.lang.NoSuchMethodError: org.mockito.internal.runners.RunnerFactory.createStrict(Ljava/lang/Class;)Lorg/mockito/internal/runners/InternalRunner;
at org.mockito.junit.MockitoJUnitRunner.<init>(MockitoJUnitRunner.java:154)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:104)
at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:86)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:26)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:33)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:49)
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)
В чем может быть проблема, вызывающая исключение NoSuchMethodError?
Код:
@RunWith(MockitoJUnitRunner.class)
public class MockTest {
@Mock
ServletUriComponentsBuilder servletUriComponentsBuilder;
@Before
public void setup() {
servletUriComponentsBuilder = mock(ServletUriComponentsBuilder.class);
}
@Test
public void shouldGenerateUrl() {
when(servletUriComponentsBuilder.fromUriString(anyString()).build().toString())
.thenReturn("test");
Assert.assertEquals("my message", "test", "test");
}
}
Вы не используете ни новейший Mockito, ни новейший JUnit. Конечно, это не является обязательным, но, поскольку вы прямо заявляете об этом, мне нужно это оспорить.
Это потому, что @Eniss использует последние версии для данных координат Maven. Это новейший JUnit 4 и новейший mockito-all. JUnit Jupiter имеет другие координаты, и mockito-all больше не выпускается.




У вас есть Mockito 1.x и 2.x на вашем пути к классам. Я думаю, это потому, что у вас есть зависимость от mockito-all:2.0.2-beta, а некоторые другие ваши зависимости имеют транзитивную зависимость от mockito-core:1.x.
Вы никогда не должны использовать mockito-all с системой сборки, которая управляет вашими зависимостями. Вместо этого используйте
testCompile group: 'org.mockito', name: 'mockito-core', version: '2.0.2-beta'
или даже более актуальная версия (см. Центральный репозиторий)
Документация Mockito: https://github.com/mockito/mockito/wiki/Declaring-mockito-dependency
Подскажите пожалуйста, если это не решит проблему.
Это не причина вашей проблемы, но, возможно, тоже полезно. Вы создаете ServletUriComponentsBuilder дважды. Сначала MockitoRunner создает его из-за аннотации @Mock, а затем вы заменяете его новым макетом в своем методе setup. Так что либо ты делаешь
@RunWith(MockitoJUnitRunner.class)
public class MockTest {
@Mock
ServletUriComponentsBuilder servletUriComponentsBuilder;
@Test
...
или ты делаешь
public class MockTest {
ServletUriComponentsBuilder servletUriComponentsBuilder;
@Before
public void setup() {
servletUriComponentsBuilder = mock(ServletUriComponentsBuilder.class);
}
@Test
...
Вы даже можете сделать это короче
public class MockTest {
ServletUriComponentsBuilder servletUriComponentsBuilder
= mock(ServletUriComponentsBuilder.class);
@Test
...
Не могли бы вы включить импорт в свой код?