Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中,获取方法在方法内的发票_Java_Unit Testing_Parsing_Junit - Fatal编程技术网

在Java中,获取方法在方法内的发票

在Java中,获取方法在方法内的发票,java,unit-testing,parsing,junit,Java,Unit Testing,Parsing,Junit,我想做一个JUnit测试,以确保某些类不使用特定的方法集(来自另一个类)。范例 在这个测试中,我想确保myMethod不涉及otherClassStaticMethod。如何在编译时找到方法内部调用的方法(忽略使用反射调用的方法)?我想到了一个.java解析器,您推荐它吗?您可以模拟“otherClass”并验证该方法是否未被调用。例如,使用,您甚至可以指定应该以何种顺序调用哪些方法(在其实例为mock的情况下),并指定不允许调用哪些方法 正如coding.mof所说,要模拟静态方法,应该使用P

我想做一个JUnit测试,以确保某些类不使用特定的方法集(来自另一个类)。范例

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

您可以模拟“otherClass”并验证该方法是否未被调用。例如,使用,您甚至可以指定应该以何种顺序调用哪些方法(在其实例为mock的情况下),并指定不允许调用哪些方法

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

例如:

PowerMockito.mockStatic(OtherClass.class);

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

听起来你应该使用一个模拟库,让它为你处理所有的事情。我推荐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
    }
}
公共类MyClass{
公共MyClass(依赖项){
依赖性=依赖性;
}
void myMethod(){
dependency.someMethod();
}
}
@RunWith(JMock.class)
公共类MyTest{
私有mockry context=新mockry();
@试验
public void doesNotCallSomeMethod(){
Dependency=context.mock(Dependency.class);
MyClass obj=新的MyClass(依赖项);

obj.myMethod();对于静态方法,您将需要Mockito的PowerMock扩展。检查方法调用通常用于确保在单元测试期间调用或不调用底层的某些方法。对于该puupose,您可以使用Mockito、EasyMock等。如果您希望强制程序员完全不使用某个API,您应该考虑使用静态代码分析工具,如PMD或CheckStyle。
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
    }
}