你究竟如何在java中存根方法或变量?

时间:2013-01-09 20:44:33

标签: java android unit-testing junit testng

例如,假设我有一个像这样的基本POJO。

public class Stuff {

   private OtherStuff otherStuff;

   ...

   public void RunOtherStuff() {
       otherStuff.run();
   }

}

你究竟如何测试RunOtherStuff调用otherStuff.run?

我现在正在使用TestNG作为我的基础测试框架,我完全可以使用任何允许我测试它的Java框架,类似于在Rails和Ruby中使用rspec等。

2 个答案:

答案 0 :(得分:0)

您要为otherStuff创建一个setter,在致电RunOtherStuff()之前,您需要致电setOtherStuff(myFake)

public class Stuff {

   private OtherStuff otherStuff;

   public void setOtherStuff(OtherStuff otherStuff) {
       this.otherStuff = otherStuff;
   }

   ...

   public void RunOtherStuff() {
       otherStuff.run();
   }

}

然后您的测试可以这样写:

private Stuff stuff;
private boolean runWasCalled;

public void setUp() {
    stuff = new Stuff();
    stuff.setOtherStuff(new OtherStuff() {
        public void run() {
            runWasCalled = true;
        }
    });
}



public void testThatOtherStuffRunMethodIsCalled() {
    stuff.RunOtherStuff();

    assertTrue(runWasCalled);
}

答案 1 :(得分:0)

写一个MockOtherStuff,它基本上是OtherStuff的子类。覆盖run()方法并说出System.out.println('Run is called');

现在,在OtherStuff课程中设置一个Stuff的setter并传递你的模型。

修改

要断言,你可能有一个布尔变量说runWasCalled(默认为false)并在MocOtherStuff.run()

中将其设置为true