我正在测试A类功能func1。
Func1有一个B类局部变量,并调用B&#39的函数func2。代码看起来像这样:
public Class A
{
public func1()
{
B object = new B();
int x = object.func2(something);
}
}
当我在单元测试中测试func1时,我不想让func2被调用。
所以我试图在测试中做这样的事情:
B textObject = new B()
{
@override
int func2(something)
{
return 5;
}
}
但它仍然在B类中调用func2。请建议如何处理。
答案 0 :(得分:2)
如果要覆盖(?![^<]*>|[^<>]*<\/)
构造函数调用 - 将其放在自己的方法中。
new B()
在测试中,您可以覆盖public Class A
{
public func1()
{
B object = newB();
int x = object.func2(something);
}
protected B newB(){
return new B();
}
}
构造函数调用。
B
然后使用public class APartitialMock extends A {
protected B newB(){
return new BMock();
}
}
public class BMock extends B {
int func2(something) {
return 5
}
}
来测试APartitialMock
的{{1}}。
PS 如果您可以或想要使用框架,请查看powermock - Mock Constructor
答案 1 :(得分:0)
我可以将B作为A中的类变量,但这似乎没有帮助 无论是。在这种情况下你会建议什么?
如果你把B作为一个类变量,那么你可以模拟B,并在A的测试对象中“交换”它。
也许不是很优雅,但又快又简单。
一个例子:
public class B {
int func2(int something){
return 3*something;
}
}
public class A
{
// declare it as protected - a test need to have access to this field to replace it
protected B object = new B();
public int func1()
{
int x = object.func2(22);
return x;
}
}
测试:
import static org.mockito.Mockito.*;
import static org.junit.Assert.*;
import org.junit.Test;
public class ATest {
@Test
public void test() {
A myA = new A();
B myB = mock(B.class);
// dummy function
when(myB.func2(anyInt())).thenReturn(20);
// replace B with mocked B
myA.object = myB;
int actual = myA.func1();
assertEquals(20, actual);
}
}