Мокито, когда не издевается, вместо вызова фактического метода - PullRequest
0 голосов
/ 10 января 2020

Я пытаюсь издеваться над Java классом.

Мой тестовый класс,

@RunWith(MockitoJunitRunner.class)
public class ATest {

@Test
public void readContent() throws Exception {

Map<String, String> params = new HashMap<>();
params.put("key", "value");

C c = Mockito.mock(C.class);
when(c.methodCall("myString")).thenReturn(params);
String response = A.readParams("anyString");
}
}
public class A{
 private A(){
 }
 public static String readParams(anyString){
 C c = new C();
 Map<String, String> map = c.methodCall("myString");
 return "returnString";
}
}

Здесь

Map<String, String> map = c.methodCall("myString"); 

эта строка не является насмешкой. вместо этого вызывает реальный метод.

Я использую следующие банки:

  • byte-buddy-1.9.5.jar
  • mockito-core-2.23.4.jar
  • objenesis-3.0.1.jar

Как я могу исследовать эту проблему?

Ответы [ 2 ]

0 голосов
/ 10 января 2020

Рабочий код я обновляю здесь ..

import java.util.Map;
import com.openbank.tr.util.ParamStore;

public class Instrument {

    ParamStore parameterStoreMock;
    public Instrument(){
        parameterStoreMock = new ParamStore();
    }

    public static String readParams(String s, ParamStore parameterStoreMock){
        Map<String, String> parameterMap = parameterStoreMock.getParams("let");
        System.out.println(parameterMap);
        return "string";
    }
}

import java.util.HashMap;
import java.util.Map;

public class ParamStore {

    public ParamStore(){
        System.out.println("constructor");
    }

    public Map<String, String> getParams(String param){
        Map<String, String> map = new HashMap<String, String>();
        map.put("a", "A");
        map.put("b", "B");
        map.put("c", "C");

        return map;
    }
}

import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.verify;
import java.util.HashMap;
import java.util.Map;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.MockitoJUnitRunner;

import com.openbank.tr.util.ParamStore;

@RunWith(MockitoJUnitRunner.class)
public class InstrumentTest {

    @Mock
    ParamStore parameterStore;

    @Test
    public void readParameterStore() throws Exception {
        Map<String, String> parameterMap = new HashMap<>();
        parameterMap.put("e", "EE");
        parameterMap.put("f", "FF");

        parameterStore = Mockito.mock(ParamStore.class);
        Mockito.when(parameterStore.getParams("let")).thenReturn(parameterMap);

        String response = Instrument.readParams("someString", parameterStore);
        verify(parameterStore).getParams("let");
        if (response != null)
            assertTrue(true);
    }

}
0 голосов
/ 10 января 2020

Проблема в том, что вы имитируете C, и внутри метода readParams вы создаете совершенно новый объект C, а ваш имитируемый объект никогда не используется. Я немного изменил ваш метод для решения этой проблемы.

 public static String readParams(C c, String anyString){
 Map<String, String> map = c.methodCall("myString");
 return "returnString";
}

, и когда вы инициализируете ответ, вы можете перейти к следующему коду, передавая c, который вы смоделировали.

String response = A.readParams(c, "anyString");
...