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

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

我不确定我错过了什么。

谢谢

最佳答案

代码示例并不完整,但是您可能会遇到一些与意外模拟 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);

    }
}

关于jmockit - 模拟方法链,其中一个方法使用 @Cascading 返回一个集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16745242/

相关文章:

Java:如何对在方法范围内创建和操作文件的方法进行单元测试?

java - Jmockit:如何验证在特定实例上调用了方法

gradle - 我们将gradle升级到V3.3后,Jmockit代码覆盖范围停止工作

java - JMockit MockUp 类和 Mockito/mock 等价物

java - 使用 mockito 或 Jmockit 模拟私有(private)静态最终字段

java - 在实例初始化程序调用的方法中记录期望

android - 如何在Android Studio中解析 "multiple dex files define Lorg/junit/runner/Runner"

java - 使用 Jmockit 进行 Servlet JUnit 测试

java - 将 @DataProvider 与 Jmockit 一起使用

java - 如何模拟抽象类的抽象方法?