java - 验证私有(private)方法未执行 JMockit

标签 java unit-testing 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正在执行私有(private)方法。我摸不着头脑,试图找出如何“检查”调用该方法而不调用/执行它。

谢谢。

最佳答案

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

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;
        }
    }
}

关于java - 验证私有(private)方法未执行 JMockit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38797588/

相关文章:

java - 字符串连接转换为 Java 中的 stringbuilder

unit-testing - NSubstitute:无法模拟与没有相应 setter 的成员变量关联的语法糖 getter 方法

java - 如何使用jmockit模拟私有(private)类?

java - JMockit自动将Array转换为ArrayList

java - 如何通过 Selenium WebDriver 和 Java 找到具有以下属性的“取消”按钮

Java,用提供的数字填充数组

javascript - 使用 Rollup.js 时如何在 Jest 测试中正确模拟函数

python - 如何模拟 '__init__'方法调用的方法

Jacoco、JMockit 和 JDK14 的 Maven surefire 插件问题

java web 应用程序 - 将内容添加到 servlet 上下文监听器的 web.xml 后无法查看 jsp 文件