我有一个方法可以在同一个类中调用其他方法,例如:
Class MyClass{
public int methodA(){
...
methodB()
...
}
public int methodB(){
...
}
}
我只想测试methodA()
,那么如何使用methodB()
隔离EasyMock
。
我该死的方法是创建一个MyClass
的虚假实例并将其注入methodA()
,如下所示:
public int methodA(MyClass fake){
...
fake.methodB();
...
}
并期待它在我的测试用例中:
MyClass fake = EasyMock.createMock(MyClass.class);
EasyMock.expect(fake.methodB()).andReturn(...);
对于这种情况有没有更好的解决方案?
答案 0 :(得分:4)
是:不要使用EasyMock,而是使用匿名本地课程。例如:
public void testXyz throws Exception() {
MyClass fake = new MyClass() {
public int methodB(){
return 12;
}
};
fake.methodA();
}
答案 1 :(得分:1)
YourClass instance = mock(YourClass.class);
when(instance.methodB(args)).thenReturn(aFakeAnswer);
when(instance.methodA(args)).thenCallRealMethod();
我很抱歉没有确切的代码,但一般情况下它会像那样工作,你可以使用它来单元测试抽象类。
答案 2 :(得分:1)
使用EasyMock这是一个非常简单的解决方案。它看起来令人生畏,但实际上是一个非常简单的概念。
诀窍是在测试类中创建常规MyClass对象和模拟MyClass对象。然后,当您实例化常规MyClass时,覆盖您想要模拟的方法,并让它在模拟的MyClass中调用相同的方法。
鉴于此课程:
Class MyClass{
public int methodA(){
...
methodB()
...
}
public int methodB(){
...
}
}
在你的测试中写道:
Class MyClassTest {
private MyClass myClass;
private MyClass mockMyClass;
...
@Test
public void testMethodA() {
// Create mock of MyClass
mockMyClass = createMock(MyClass.class);
// Instantiate MyClass overriding desired methods with mocked methods
myClass = new MyClass() {
@Override
public int methodB() {
return mockMyClass.methodB();
}
};
// Set expectations
expect(mockMyClass.methodB()).andReturn(...);
replay(mockMyClass);
// Call test method - will in turn call overridden, mocked methodB()
myClass.methodA();
verify(mockMyClass);
}
}
您可能希望使用辅助方法来根据您正在测试的方法对myClass进行不同的实例化。
答案 3 :(得分:0)
我认为你应该考虑重构MyClass
。
如果两种方法在methodB()
中使用相同的逻辑,那么将逻辑提取到私有方法将使您能够测试孤立的场景调用这些方法中的每一种。