3

我有一个静态方法,用于多个地方,主要是在静态初始化块中。它接受一个 Class 对象作为参数,并返回该类的实例。我只想在特定的 Class 对象用作参数时模拟这个静态方法。但是当从其他地方调用该方法时,使用不同的Class对象,它返回null。
如果参数不是模拟参数,我们如何让静态方法执行实际实现?

class ABC{
    void someMethod(){
        Node impl = ServiceFactory.getImpl(Node.class); //need to mock this call
        impl.xyz();
    }
}

class SomeOtherClass{
    static Line impl = ServiceFactory.getImpl(Line.class); //the mock code below returns null here
}


class TestABC{
    @Mocked ServiceFactory fact;
    @Test
    public void testSomeMethod(){
         new NonStrictExpectations(){
              ServiceFactory.getImpl(Node.class);
              returns(new NodeImpl());
         }
    }
}
4

1 回答 1

4

您想要的是一种“部分模拟”形式,特别是 JMockit API 中的动态部分模拟:

@Test
public void testSomeMethod() {
    new NonStrictExpectations(ServiceFactory.class) {{
        ServiceFactory.getImpl(Node.class); result = new NodeImpl();
    }};

    // Call tested code...
}

只有符合记录期望的调用才会被嘲笑。当动态模拟类被调用时,其他人将执行真正的实现。

于 2013-04-22T12:08:45.687 回答