jmockit - 模拟方法链,其中一个方法使用@Cascading返回一个Collection

时间:2013-05-25 00:19:52

标签: jmockit

我正在尝试模拟一个类似这样的方法调用:

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(),一切正常。

我不确定我错过了什么。

由于

1 个答案:

答案 0 :(得分:2)

代码示例不完整,但您可能会遇到与意外模拟Map相关的问题。如果一个Map(或Collection框架的任何部分)被嘲笑,那么很多东西都会破坏。我无法重现您的问题,因为任何使用@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);

    }
}