4

我试图模拟一个方法调用,它是这样的:

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

我不确定我错过了什么。

谢谢

4

1 回答 1

3

代码示例不完整,但您可能会遇到一些与意外模拟 Map 相关的问题。如果一个 Map(或 Collection 框架的任何部分)被模拟,那么很多事情都会失败。我无法重现您的问题,因为任何使用 @Cascading 模拟 RapContext 的尝试都会导致堆栈溢出。

您可以改为部分模拟 RapContext,然后返回真实或模拟的 Map。当我遇到类似问题时,我通常使用 @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);

    }
}
于 2013-10-03T16:40:24.333 回答