Unit testing JMockit中私有方法的验证

Unit testing JMockit中私有方法的验证,unit-testing,private,jmockit,Unit Testing,Private,Jmockit,我想验证在我的JMockit测试类中是否调用了私有方法。我不想模拟私有方法,只想确保它已被调用 这可能吗?如果可能,如何实现 (我发现了一个类似的问题,但是那里的私有方法被嘲笑了,如果我能避免的话,我不希望这样。) 下面是我想做的一个例子 public class UnderTest { public void methodPublic(){ ..... methodPrivate(aStringList); ..... } private void me

我想验证在我的JMockit测试类中是否调用了私有方法。我不想模拟私有方法,只想确保它已被调用

这可能吗?如果可能,如何实现

(我发现了一个类似的问题,但是那里的私有方法被嘲笑了,如果我能避免的话,我不希望这样。) 下面是我想做的一个例子

public class UnderTest {

  public void methodPublic(){
    .....
    methodPrivate(aStringList);
    .....
  }

  private void methodPrivate(List<String> slist){
    //do stuff
  }
}

public class TestMyClass {

  @Tested
  UnderTest cut;

  @Mocked
  List<String> mockList;

  @Test
  public void testMyPublicMethod() {

    cut.methodPublic();

    new Verifications() {
      {
        // this doesnt work for me...
        invoke(cut, "methodPrivate", mockList);
        times = 1;
      }
    }
  }
}
公共类未测试{
public void methodPublic(){
.....
methodPrivate(aStringList);
.....
}
private void methodPrivate(列表列表){
//做事
}
}
公共类TestMyClass{
@测试
试割;
@嘲弄
清单模拟清单;
@试验
public void testMyPublicMethod(){
cut.methodPublic();
新的核查(){
{
//这对我不起作用。。。
调用(剪切“methodPrivate”,模拟列表);
次数=1;
}
}
}
}
您需要一个部分模拟(如果您希望知道私有方法是否被触发,则无法避免在此实例中模拟该方法-只能对模拟的方法或实例进行验证)。我以前没有使用过JMockit,但我希望代码看起来类似于:

public class TestMyClass {

  @Tested
  UnderTest cut;

  @Mocked
  List<String> mockList;

  @Test
  public void testMyPublicMethod() {

    cut.methodPublic();

    new Expectations(UnderTest.class) {{
       cut.methodPrivate();
    }}

    new Verifications() {
      {
        // this should hopefully now work for you
        invoke(cut, "methodPrivate", mockList); //I assume here that you have statically imported the Deencapsulation class
        times = 1;
      }
    }
  }
}
公共类TestMyClass{
@测试
试割;
@嘲弄
清单模拟清单;
@试验
public void testMyPublicMethod(){
cut.methodPublic();
新的期望值(未测试的类){{
cut.methodPrivate();
}}
新的核查(){
{
//希望现在这对你有用
invoke(cut,“methodPrivate”,mockList);//我假设您已经静态导入了Deencapsulation类
次数=1;
}
}
}
}
答案中值得注意:“验证只能在模拟的方法或实例上进行”。因此,我通过实际调用私有方法来“解决”它,然后使用assertEquals()验证结果(因为有些人建议不要模拟私有方法)。另一种方法是模拟私有方法(如上所述),只进行验证(),这使得私有方法未经测试。。。