在测试公共方法时调用私有方法的Jmockit Expectations / Verifications?

时间:2014-10-02 20:05:15

标签: jmockit

任何人都可以建议是否可以使用期望/验证来测试私有方法被称为正确的次数/右参数。

被测试的课程已被Mocked-Up - 一个私有方法被覆盖。

Am测试一个调用许多私有方法的公共方法。

我想知道是否可以验证在执行公共方法时将调用的其他私有方法的调用?

测试中的代码/类的一些想法;

public class UnderTest {

    public void methodPublic(arg 1){
        .....
        methodPrivate1(var1);
        ....
        methodPrivate2(var2);
    }

    private void methodPrivate1(var1){
        //do stuff
    }

    private void methodPrivate2(var1){
        //do stuff
    }

}

在我的测试用例中

@Test
public void stateBasedTestMethod()
{
    UnderTest underTest;

    new MockUp<UnderTest>() {
        @Mock(invocations = 1)
        private void methodPrivate2(var1) {
            //do nothing in the mocked case
        }
    };

    underTest = new UnderTest();
    underTest.methodPublic(arg1);

    new Verifications() {{
        // Is there a way to test that methodPrivate1 has been called-once/with-expected-arguments
    }};
}

根据罗格里奥的回答编辑。 我正在使用jmockit 1.12 并且验证失败,因为使用提供的解决方案的方法是按照我在JMockit文档中的想法调用该方法两次。

失败追踪; mockit.internal.UnexpectedInvocation:预计MyHelperTest $ 1#method3 ...只有1次调用,但被调用2次

包含我正在使用的完整代码。 如上所述 - 我的目标是模拟其中一个私有方法什么都不做。 并确保我可以验证另一个私有方法只被调用一次。

提前致谢,如果Jmockit可以做到这一点,希望能更好地理解。

测试代码。

public class MyHelperTest {

    @Test
    public void testHelper(@Mocked final MyDependent myDependent) {

        final MyHelper myHelper;

        new MockUp<MyHelper>() {

            @Mock(invocations = 1)
            private void method3(MyDependent myTable) {
                System.out.println("In Mocked Method");
                //do nothing in the mocked case
            }

        };

        myHelper = new MyHelper();

        myHelper.method1(myDependent);

        new Verifications() {{ 
            invoke(myHelper, "method2", myDependent); times = 1; 
        }};
    }

}

待测班。

public class MyHelper {

    public void method1(MyDependent myDependent){
        method2(myDependent);
    }

    private void method2(MyDependent myDependent) {
        myDependent.setValue(1);
        method3(myDependent);
    }

    private void method3(MyDependent myDependent) {
        myDependent.setValue(2);
    }

}

依赖类

public class MyDependent {

    private int value;

    public int getValue() {
        return value;
    }

    public void setValue(int value) {
        this.value = value;
    }

}

2 个答案:

答案 0 :(得分:2)

虽然不建议模拟private方法,但这是可能的。

使用Expectations API:

@Tested @Mocked MyHelper myHelper;

@Test
public void testHelper(@Mocked final MyDependent myDependent)
{
    new NonStrictExpectations() {{ invoke(myHelper, "method3", myDependent); }};

    myHelper.method1(myDependent);

    new Verifications() {{ invoke(myHelper, "method2", myDependent); times = 1; }};
}

... invoke(...)方法从类mockit.Deencapsulation静态导入。

答案 1 :(得分:0)

我注意到,如果您要验证的方法未被模拟,则在执行期望或验证实例中的静态块时,代码会调用您尝试按预期标记的方法或验证。 这可能解释了您所看到的额外调用。

一个建议:如果您已经使用MockUp模拟了类(从而创建了一个匿名子类),那么您可以覆盖私有方法,为什么不将被重写的私有方法的访问权限更改为protected或public?然后,您可以创建期望或验证。

您还可以提供公共字段&#34; public int counter = 0;&#34;并让你的重写方法增加计数器。然后,您可以在测试完成后在其上使用断言。

相关问题