1

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

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

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

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

4

2 回答 2

2

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

正如 coding.mof 所说,要模拟静态方法,您应该使用 PowerMock/PowerMockito:

例子:

PowerMockito.mockStatic(OtherClass.class);

PowerMockito.verifyStatic(never());
OtherClass.otherClassStaticMethod();
于 2012-07-30T13:05:01.247 回答
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,因为我避开静态方法,除非它们是纯函数

于 2012-07-30T13:07:46.067 回答