在Java中的方法内调用方法

时间:2012-07-30 13:00:50

标签: java unit-testing parsing junit

我想进行一个JUnit测试,以确保某些类不使用一组特定的方法(来自另一个类)。实施例

class MyClass
{
   void myMethod()
   {
       otherClass.otherClassStaticMethod();
   }
}

class myTest
{
    void test()
    {
        assertFalse(CalledMethods.getMethodsCalledBy("myClass.myMethod").Contains("otherClass.otherClassStaticMethod"));
    }
}

在这个测试中,我想确保myMethod不会调用otherClassStaticMethod。如何在编译时找到方法内部调用的方法(忽略使用反射调用的方法)?我想过一个.java解析器,你推荐一个吗?

2 个答案:

答案 0 :(得分:2)

您可以模拟“otherClass”并验证该方法未被调用。例如。使用Mockito你甚至可以指定应该调用哪些方法(在他们的实例是模拟的情况下),并指定不允许调用哪些方法

作为coding.mof说,要模拟静态方法,你应该使用PowerMock / PowerMockito:

示例:

PowerMockito.mockStatic(OtherClass.class);

PowerMockito.verifyStatic(never());
OtherClass.otherClassStaticMethod();

答案 1 :(得分:1)

听起来你应该使用模拟库并让它为你处理它。我推荐JMock作为我的首选库。如果你正在使用实例方法,那么这对你来说是完美的 - 如果,如你的例子所示,它是静态方法,那么PowerMock可以工作* 1.

使用JMock,你会有类似的东西:

public class MyClass {
    public MyClass(Dependency dependency) {
        this.dependency = dependency;
    }

    void myMethod() {
        dependency.someMethod();
    }
}

@RunWith(JMock.class)
public class MyTest {
    private Mockery context = new Mockery();

    @Test
    public void doesNotCallSomeMethod() {
        Dependency dependency = context.mock(Dependency.class);
        MyClass obj = new MyClass(dependency);

        obj.myMethod();  <--- this will fail fast
    }
}

当你调用obj.myMethod时,JMock会立即报告你从未说过依赖项应该有任何调用的方法。它还会告诉您DID调用的方法以及传入的参数(如果有的话)

* 1我不使用PowerMock,因为我避开静态方法,除非它们是纯函数