Java 如何在单元测试中重写被测试类所调用的方法
我正在测试一个类的函数func1 Func1有一个B类局部变量,并调用B的函数func2。代码如下所示:Java 如何在单元测试中重写被测试类所调用的方法,java,unit-testing,junit,mocking,easymock,Java,Unit Testing,Junit,Mocking,Easymock,我正在测试一个类的函数func1 Func1有一个B类局部变量,并调用B的函数func2。代码如下所示: public Class A { public func1() { B object = new B(); int x = object.func2(something); } } 在单元测试中测试func1时,我不希望调用func2 所以我试着在测试中这样做: B textObject = new B() { @override
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。请建议如何处理此问题。如果要重写
新的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
}
}
然后使用apartialmock
用您的B
测试func1
PS如果您可以或想要使用框架,请查看powermock-
我可以将B作为a中的类变量,但这似乎没有帮助
任何一个在这种情况下,你有什么建议
如果将B作为类变量,则可以模拟B,并在a的测试对象中“交换”它。也许不是很优雅,但是又快又简单。
例如:
public class B {
int func2(int something){
return 3*something;
}
}
还有一个测试:
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);
}
}
您是否可以使用依赖项注入、重构
A
将B
作为参数,而不是在函数中创建一个新的
参数?对于这样一个抽象的例子,很难给出合理的建议。我不能在A的构造函数中将B作为输入,也不能在func1中将B作为输入,因为我正在重写类A中的func1。我可以将B作为类A中的类变量,但这似乎也没有帮助。在这种情况下,你有什么建议?我不确定问题出在哪里;同样,这个例子太抽象了。做一些关于DI的研究。使用依赖注入解决了这个问题,谢谢你的帮助。在这种情况下,你可以写下来接受你自己的答案,而不是接受一个不是你真正解决问题的答案!我最终解决了这个抛出依赖注入,但这是一个伟大的建议!谢谢
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);
}
}