如何模拟下游方法调用?

时间:2017-07-05 17:34:49

标签: java junit mocking mockito

我有一个问题,我有一些代码,如

import java.io.File;
import java.util.ArrayList;

public class nameCompare {

    public static void main(String[] args) {

        String path1 = "C:/Users/hoflerj/Desktop/test"; 
        String path2 = "C:/Users/hoflerj/Desktop/test2"; 

        File folder1 = new File(path1);
        File folder2 = new File(path2);

        File[] listOfFiles1 = folder1.listFiles(); 
        File[] listOfFiles2 = folder2.listFiles(); 

        ArrayList<String> fileNames1 = new ArrayList<String>();
        ArrayList<String> fileNames2 = new ArrayList<String>();

        for (int i = 0; i < listOfFiles1.length; i++) 
        {

            if (listOfFiles1[i].isFile()) 
            {
                fileNames1.add(listOfFiles1[i].getName());//wow
            }
        }

        for (int i = 0; i < listOfFiles2.length; i++) 
        {

            if (listOfFiles2[i].isFile()) 
            {
                fileNames2.add(listOfFiles2[i].getName());//seriously wow
            }
        }


        for ( int i = 0; i < 1; i++ )
        {
            if (fileNames1.equals(fileNames2) )
            { 
                System.out.println("Files names are the same");
            }

            else if (fileNames1 != fileNames2 )
            { 
                System.out.println("Files names are not equal");
            }
        }

    }

}

我正在尝试调用public void a() { Obj1 one = Obj1(); Obj2 two = Obj2(); one.b(); two.c(); } 方法,我希望执行a()方法,但我想嘲笑b()方法。

最好的方法是什么,因为c()Obj2 two内宣布了?

2 个答案:

答案 0 :(得分:1)

两个选项:

  • 你重新设计你的设计变得更容易测试。例如,通过摆脱new Obj2()电话。相反,您可以将Obj2对象的工厂传递给该类;并使用它。工厂返回模拟对象;你很好。或者你研究依赖注入的其他机制。
  • 您转向PowerMock(ito),它允许模拟对new的调用;例如BrowserWindow概述。

我个人的两分钱:我建议选择选项1 - 改善设计总是更好;而不是使用大(丑)PowerMock锤来“修复”设计问题。所以,一个简单的例子是:

public class EnclosingClass {
  private final Obj2Factory factory;
  EnclosingClass(Obj2Factory factory) {
    this.factory = factory;
  }
 void a() {
   Ob2 two = factory.make();
 }

答案 1 :(得分:0)

这是一个工作示例测试,使用JMockit库(我开发):

@Test
public void exampleTest(@Mocked Obj2 anyObj2) {
    new A().a();

    // In case we want to check two.c() was called:
    new Verifications() {{ anyObj2.c(); }};
}