我试图模拟一个方法调用,它是这样的:
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/