NoSuchMethodError: org.mockito.internal.runners.RunnerFactory.createStrict

Я использую последние версии 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");
    }

}

Не могли бы вы включить импорт в свой код?

RCB 17.05.2018 17:36

Вы не используете ни новейший Mockito, ни новейший JUnit. Конечно, это не является обязательным, но, поскольку вы прямо заявляете об этом, мне нужно это оспорить.

Michael Piefel 17.05.2018 21:12

Это потому, что @Eniss использует последние версии для данных координат Maven. Это новейший JUnit 4 и новейший mockito-all. JUnit Jupiter имеет другие координаты, и mockito-all больше не выпускается.

Stefan Birkner 17.05.2018 21:17
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
3
4 266
1

Ответы 1

mockito-core

У вас есть 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
    ...

Другие вопросы по теме