验证私有方法未执行 JMockit

Verify that a private method was NOT executed JMockit

我四处寻找这个问题,但没有找到我真正需要的东西。我对 JMockit 和模拟有了更多的了解。哪个好。似乎每个人都想知道如何确保某些事情已经执行。我想学习相反的东西。

好的 - 我正在编写一个测试来检查 public 方法中不太愉快的路径。正在测试的方法是 void 所以我不能真正 assert 结果。 我想做的是验证在这个测试用例中没有执行一个方法。

例如:

class ClassToTest {
  private void method(String arg){}

  public void publicMethod(String arg0, String arg1){
    if(false){
      //this method should never get called.
      method(arg0);
    }
  }
}

class TestingClass{
  @Tested
  private ClassToTest classToTest = new ClassToTest();

  @Test
  public void testCheckingIfPrivateMethodWasCalled(){
    classToTest.publicMethod("string1", "string2");

    new Verifications() {
      {
        //At this point I am trying something like
        Deencapsulation.invoke(classToTest, "method", "string1");
        times = 0; //Also tried maxTimes = 0;
        //Through debug it looks like the invoke is doing what it's named...
        //invoking the private method, I don't want to invoke.
        //How do I check that ClassToTest#method was not called?
      }
    }
  }
}

我得到的测试用例结果是 java.lang.IllegalStateException: Missing invocation to mocked type at this point; please make sure such invocations appear only after the declaration of a suitable mock field or parameter。在 times = 0;.

线上

我知道 invoke 正在执行私有方法。我挠头试图弄清楚如何 "check" 在没有 invoking/executing 的情况下调用该方法。

谢谢。

一种方法是使用 MockUp API for faking:

import static org.junit.Assert.assertFalse;

import org.junit.Test;

import mockit.Mock;
import mockit.MockUp;
import mockit.Tested;

public class TestingClass {

    @Tested
    private ClassToTest classToTest = new ClassToTest();

    @Test
    public void testCheckingIfPrivateMethodWasCalled() {
        PrivateMethodCheckMockUp mockUp = new PrivateMethodCheckMockUp() {
            @Mock
            private void method(String arg) {
                calledPrivate = true;
            }
        };

        classToTest.publicMethod("string1", "string2");

        assertFalse(mockUp.calledPrivate);
    }

    class PrivateMethodCheckMockUp extends MockUp<ClassToTest> {
        boolean calledPrivate = false;

        @Mock
        private void method(String arg) {
            calledPrivate = true;
        }
    }
}