jmockit—模拟方法链,其中一个方法使用@Cascading返回集合

jmockit—模拟方法链,其中一个方法使用@Cascading返回集合,jmockit,Jmockit,我正在尝试模拟一个方法调用,该调用如下所示: rapContext.getSysInfo().get(key) getSysInfo()方法返回ConcurrentHashMap 以下是我所做的: Class ABCTest { @Cascading RapContext context; @Test doTest() { new Expectations() { { rapContext.getSysInfo().get

我正在尝试模拟一个方法调用,该调用如下所示:

rapContext.getSysInfo().get(key)
getSysInfo()方法返回ConcurrentHashMap

以下是我所做的:

Class ABCTest {
    @Cascading RapContext context;

    @Test
    doTest() {
      new Expectations() {

        {
        rapContext.getSysInfo().get(anyString);
            result = new UserPrefCtxObject();
         }
      }
    }
有了它,我在rapContext.getSysInfo()上得到了一个NullPointerException。对getSysInfo()的调用返回null。如果调用任何其他不返回集合的方法,例如rapContext.getDomain(),一切正常

我不确定我错过了什么


谢谢

代码示例不完整,但是您可能会遇到与意外模拟地图相关的问题。如果地图(或集合框架的任何部分)被模拟,那么很多东西都会被破坏。我无法重现您的问题,因为任何使用@Cascading模拟RapContext的尝试都会导致堆栈溢出

您可以部分模拟RapContext,然后返回一个真实或模拟的映射。当我遇到类似的问题时,我通常使用@Injectable只模拟类的实例或使用部分模拟来绕过它们

下面是一种让您模拟getSysInfo的方法:

   public class RapContextTest {

    @Injectable ConcurrentHashMap<String, Object> mockedMap;

    @Test
    public void testContext() {
        RapContext context = new RapContext();

        new MockUp<RapContext>(){
            @Mock
            public ConcurrentHashMap getSysInfo(){
                return mockedMap;
            }

        };

        new NonStrictExpectations() {
            {
                mockedMap.get(anyString);
                result = "Success";

            }
        };

        Object value = context.getSysInfo().get("test");
        System.out.println(value);

    }
}
公共类RapContextTest{
@可注射的ConcurrentHashMap-mockedMap;
@试验
公共void testContext(){
RapContext=新的RapContext();
新模型(){
@嘲弄
公共ConcurrentHashMap getSysInfo(){
返回mockedMap;
}
};
新的非严格测量(){
{
mockedMap.get(anyString);
结果=“成功”;
}
};
对象值=context.getSysInfo().get(“测试”);
系统输出打印项次(值);
}
}

请发布完整的代码示例。这甚至不能像这里所示进行编译,因为从来没有声明过
rapContext