我有不想触及的遗留代码。
public class LegacyCode{
public LegacyCode() {
Service s = new ClassA();
s.getMessage();
}
}
Where ClassA
提供 CORBA 服务调用。
public class ClassA implements Service{
@Override
public String getMessage() {
// Make CORBA service call...
return "Class A";
}
}
和界面Service
好像;
public interface Service {
String getMessage();
}
出于测试目的,我想替换的实现Service
(in LegacyCode
实施者ClassA
)带有存根。
public class ClassB implements Service {
@Override
public String getMessage() {
return "Stub Class B";
}
}
到目前为止,一切都很好。但是是否可以在不修改显示的遗留代码的情况下加载ClassB
代替ClassA
在实例化时ClassA
?
// In my test workbench
new LegacyCode(); // "Stub Class B"
我尝试编写一个自定义类加载器并在应用程序启动时通过 java vm 参数加载它,但仅加载第一个类(此处LegacyCode
)由该加载程序加载。
提前致谢
Using PowerMock
您可以为构造函数代码创建模拟(或存根)。答案取自这个链接。我将尝试将其转换为与您的用例完全匹配:
@RunWith(PowerMockRunner.class)
@PrepareForTest(ClassA.class)
public class LegacyTester {
@Test
public void testService() {
// Inject your stub
PowerMock.createMock(ClassA.class);
Service stub = new MyServiceStub();
PowerMock.expectNew(ClassA.class).andReturn(stub);
PowerMock.replay(stub, ClassA.class);
// Implement test logic here
LegacyCode legacyCode = new LegacyCode();
// Implement Test steps
// Call verify if you want to make sure the ClassA constructor was called
PowerMock.verify(stub, ClassA.class)
}
}
这样,您可以在调用时注入存根ClassA
构造函数发生,而无需更改遗留代码。希望这就是您所需要的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)