Mockito Spy doReturn вызывает оригинальный метод - PullRequest
0 голосов
/ 29 января 2019

Я новичок в Мокито.Я знаю, что шпионский объект никогда не вызовет оригинальный метод для doReturn, но в моем коде этого не происходит

import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.spy;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.mockito.runners.MockitoJUnitRunner;

class MyClass {
    public int method1(){
        int x =10;
        x = method2(2);
        return x;
    }

    public int method2(int y){
        method3();
        return 20;
    }

    public int method3(){
       return 30;
    }
}

@RunWith(MockitoJUnitRunner.class)
public class Method1Test {
    private MyClass myClass = new MyClass();

    @Before
    public void setup(){}

    @Test
    public void test01(){
        MyClass spyMyClass = spy(myClass);
        doReturn(28).when(spyMyClass).method2(any());
        int a = spyMyClass.method1();
        assertTrue("We did it!!!",a==20);
    }
}

Ниже приведена трассировка стека ошибок :

java.lang.NullPointerException at com.Method1Test.test01 (Method1Test.java:45) в sun.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод) в sun.reflect.NativeMethodAccessorImpl.invoke (неизвестный источник)refle.DelegatingMethodAccessorImpl.invoke (Неизвестный источник) по адресу java.lang.reflect.Method.invoke (Неизвестный источник) по адресу org.junit.runners.model.FrameworkMethod $ 1.runReflectiveCall (FrameworkMethod.java:jun. org. org.runners.model.ReflectiveCallable.run (ReflectiveCallable.java:12) в org.junit.runners.model.FrameworkMethod.invokeExplosively (FrameworkMethod.java:47) в org.junit.internal.runners.statedhoe ().Java: 17) в org.junit.internal.runners.statements.RunBefores.evaluate (RunBefores.java:26) в org.junit.runners.ParentRunner.runLeaf (ParentRunner.java:325) по адресу org.junit.runners.BlockJUnit4ClassRunner.runChild (BlockJUnit4ClassRunner.java:78) по адресу org.junit.runners.BlockJUnit4ClassRunner.runChild (BlockJUnit4ClassRunner.jrun.unerjava: 290) в org.junit.runners.ParentRunner $ 1.schedule (ParentRunner.java:71) в org.junit.runners.ParentRunner.runChildren (ParentRunner.java:288) в org.junit.runners.ParentRunner.pak(ParentRunner.java:58) в org.junit.runners.ParentRunner $ 2.evaluate (ParentRunner.java:268) в org.junit.runners.ParentRunner.run (ParentRunner.java:363) в org.mockito.internal.runners.JUnit45AndHigherRunnerImpl.run (JUnit45AndHigherRunnerImpl.java:37) в org.mockito.runners.MockitoJUnitRunner.run (MockitoJUnitRunner.java:62) в org.eclipin) в org.eclipse.jdt.internal.junit.runner.TestExecution.run (TestExecution.java:38) в org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests (RemoteTestRun)ner.java:538) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests (RemoteTestRunner.java:760) в org.eclipse.jdt.internal.junit.runner.RestoteTestRunner.run (460) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main (RemoteTestRunner.java:206)

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: 
Misplaced argument matcher detected here:

-> at com.Method1Test.test01(Method1Test.java:45)

Пожалуйста, кто-нибудь поможет мне в выше, а также предоставит мне исправление длявышеуказанный вопрос.

1 Ответ

0 голосов
/ 29 января 2019

Проблема вызвана несоответствием типов для параметра, передаваемого в method2.Вот что говорит вам эта часть сообщения об исключении:

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: здесь обнаружен неуместный сопоставитель аргументов:

Следующий тест пройден:

@Test
public void test01(){
    MyClass spyMyClass = spy(myClass);
    doReturn(28).when(spyMyClass).method2(anyInt());
    int a = spyMyClass.method1();
    assertTrue("We did it!!!",a==28);
}

Здесь есть два изменения:

  1. Используйте anyInt() вместо any()
  2. Утвердите, что a==28, потому что вы говоритезаглушка для возврата 28
...