JMockit 验证是否调用了私有方法

JMockit verify if private method is called

我正在测试一个 public 方法,我想验证是否调用了具有模拟参数的私有方法。 我找到的所有答案都使用 invoke 方法,但自 JMockit v1.36

以来已将其删除
public class ClassToTest{

   public void methodToTest(){
     DependencyClass abc = new DependencyClass();
     if(privateMethod1()){
        privateMethod2(abc);
     }
   }
   
   private boolean privateMethod1(){ return true; }
   
   private void privateMethod2(DependencyClass abc){ abc.doStuff(); }
}

public class testClassToTest{
   
   @Mocked
   DependencyClass abc;
   
   @Tested 
   ClassToTest testedClass;

   @BeforeEach
   public void setUp() { 
     testedClass = new ClassToTest();
   }
    
   @Test
   public void testMethod(){
        new MockUp<ClassToTest>() {
            @Mock
            private boolean privateMethod1() {
                return true;
            }
        };
        
        testedClass.methodToTest();

        new FullVerificationsInOrder() {{
            abc = new DependencyClass();
            //Check here if privateMethod2(abc) gets called once
        }};
   }

你有两种方法:

  1. 将方法的范围从私有提升到包私有,之后,您的方法将在测试中可见。
  2. 重构您的代码并将私有方法封装到 Predicate 之后,您可以分别测试您的主方法和 Predicate。

您不能通过 Junit 测试私有方法。

您可以使用 Powermock 来模拟和验证私有方法。

请检查https://github.com/powermock/powermock/wiki/MockPrivate