【问题标题】:Mockito when is not mocking instead of calling actual methodMockito when 不是模拟而不是调用实际方法
【发布时间】:2020-01-24 03:40:47
【问题描述】:

我正在尝试模拟 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

我该如何调查这个问题?

【问题讨论】:

  • 您的when 使用“myString”,但随后readParams 方法使用“stringVal”-我猜是因为这两个值不同,when 未被调用-尝试使用@987654326 @在你的when(...)
  • 对不起。我会编辑。都是字符串值。我认为字符串值没有问题。
  • 您创建了一个mock(C.class),但您的方法readParams 使用的是完全不同的new C()。这正是依赖注入的目的;将其作为参数传递给readParams
  • @JagadeesanKarunakaran,如果您希望我们帮助您,您应该发布实际代码。该代码无法编译:public static String readParams(anyString) - anyString 是什么? when(c.methodCall("myString").thenReturn(params); - 缺少括号。
  • 您需要在A类中注入C类的mock。由于您已将A类的构造函数设为私有,您需要在readParams(String anyString, C c)中传递C类的模拟实例方法。

标签: java class junit mocking mockito


【解决方案1】:

问题是您在模拟 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");

【讨论】:

    【解决方案2】:

    我在这里更新的工作代码..

    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);
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 2019-10-15
      相关资源
      最近更新 更多