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

man*_*hou 3 java jmockit junit4

我在使用jmockit时遇到了以下问题。

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

例如:

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 ...");
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Rog*_*rio 5

有两种方法:

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();
        }};
    }
}
Run Code Online (Sandbox Code Playgroud)

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