如何使用 jmockit 模拟整个抽象 class 但排除一个或多个应在一个 JUnit4 测试用例中验证的方法?

How to use jmockit to mock a whole abstract class but exclude one or several methods that should be verified within one JUnit4 test case?

我在使用jmockit的时候遇到了下面的问题

我有一个抽象class,它还有很多具体(非抽象)的实例方法,现在我想写一个JUnit4测试用例来验证抽象的一个非抽象和实例方法class 但模拟 class?

中的所有其他方法

例如:

public class abstract Animal {
    public abstract void abstractMethod1();
    ......
    public abstract void abstractMethodN();

    public void method1() {
      System.out.println("Do something1 ...");
    }

    public void method2() {
      System.out.println("Do something2 ...");
    }

    ......
    public void methodN() {
      method1();
      method2();
      System.out.println("Do somethingN ...");
    }
}

对于这个定义的class,我想写一个JUnit4测试用例来验证methodN中的逻辑,所以我想模拟整个class。 (method1和method2,mock或者不mock都可以。)怎么做?

有两种方法:

public class AnimalTest
{
    // Both tested and (partially) mocked:
    @Tested @Mocked Animal animal;

    @Test
    public void testMethodNWhileMockingMethods1And2()
    {
        // Recorded methods will be mocked:
        new Expectations() {{
            animal.method1();
            animal.method2();
        }};

        // Methods not recorded execute normally.
        animal.methodN();
    }

    @Test
    public void testMethodNWhileExecutingMethods1And2AndAlsoVerifyingTheyWereCalled()
    {
        animal.methodN();

        // Executed methods can still be verified:
        new Verifications() {{
            animal.method1();
            animal.method2();
        }};
    }
}

请注意,验证实际执行的方法虽然可能,但可能不是一个好主意;最好通过更常规的方式来验证这些方法的作用。