3

我有我不想觸及的遺留代碼。在不觸及代碼的情況下替換實例化類的實現(java)

public class LegacyCode{ 
    public LegacyCode() { 
     Service s = new ClassA(); 
     s.getMessage(); 
    } 
} 

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有存根的實現(LegacyCodeClassA實現)。

public class ClassB implements Service { 
    @Override 
    public String getMessage() { 
     return "Stub Class B"; 
    } 
} 

到目前爲止好。但是在沒有任何修改的情況下,有可能在ClassA的實例化處加載ClassB而不是ClassA

// In my test workbench 
new LegacyCode(); // "Stub Class B" 

我試圖寫一個自定義類加載和Java虛擬機的參數在應用程序啓動加載它,但只有第一類(這裏LegacyCode)是由加載器加載。

在此先感謝

+1

最好是從頭開始使用依賴注入。那麼這些問題將是沒有意義的。 –

+0

感謝您的回答。不幸的是,現有的代碼(很多類)目前不提供此功能。我們不想在沒有新的業務要求的情況下做出這些判斷。但是我們需要在沒有CORBA調用的情況下測試代碼。 – abertschi

+0

這是爲了單元測試,如果是這樣的話,你可以用功率模擬來完成。讓我知道如果是這樣,我會解釋如何。 – Avi

回答

3

使用PowerMock您可以創建一個構造函數代碼進行模擬(或存根)。答案摘自this link。我會嘗試將它轉換爲完全匹配才能對你的使用情況:

@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構造情況,在不改變原有代碼。希望這就是你需要的。

相關問題