2014-12-05 73 views
0

是否可以模擬在我單元測試的類中實例化的類?JUnit&EasyMock

class ClassToTest { 
    public String methodToTest(object a, object b, object c) { 
     //Do Lots of cool stuff here 
     SomeOtherClass someOtherClass = new SomeOtherClass(); 
     someOtherClass.doMoreCoolStuff(a, b, c, this); 
     //Do even more cool stuff to "this" as it was updated by someOtherClass 
} 

我想模擬SomeOtherClass將使用int ClassToTest。我使用EasyMock,我似乎無法得到它編譯。有任何想法嗎?我是否在談論這個錯誤?思考?

+0

我不認爲你可以嘲笑那個類,除非你使用非常晦澀的Java黑魔法,通過設計,你應該避免實例化這樣的類,而應該關聯類,以便它們不那麼耦合。當你移動到關聯中時,你可以嘲笑周圍的對象。在你的情況下,你可以將你的實例化類和方法調用作爲一個私人調用,然後你不要模擬它,只是作爲methodToTest測試的一部分進行測試。 – Desorder 2014-12-05 20:56:48

回答

0

你需要一些方法來獲得模擬在那裏。這是測試的一部分。當你發現這樣的事情,並且你說「我無法測試」時,你需要重構代碼,以便測試。正是這種重構將緩慢地將怪異和奇怪的設計變成美麗的藝術。 (太深?)

例如:

interface Factory { 
    public SomeOtherClass create(); 
} 

class ClassToTest { 
    Factory factory; 
    public void setFactory(Factory factory) { this.factory = factory } 

    public String methodToTest(object a, object b, object c) { 
     //Do Lots of cool stuff here 
     SomeOtherClass someOtherClass = factory.create(); 
     someOtherClass.doMoreCoolStuff(a, b, c, this); 
     //Do even more cool stuff to "this" as it was updated by someOtherClass 
} 

的測試將是這樣的:

public void test() { 
    SomeOtherClass mock = EasyMock.create(SomeOtherClass.class); 
    Factory factory = EasyMock.create(Factory.class); 

    ClassToTest test = new ClassToTest(); 
    test.setFactory(factory); 

    expect(factory.create()).andReturn(mock); 

    // can now test mock interaction 

    replay(mock,factory); 
    test.methodToTest(a,b,c); 
    verify(mock,factory); 

} 

有很多方法可以做到這一點。重點是讓你的代碼可測試。有很多次我發現自己需要一種方法來寫一些我只寫了一個類的方法,因爲我需要它來進行測試。

0

你可以使用Powermock來做到這一點。

SomeOtherClass soc=EasyMock.createNiceMock(SomeOtherClass.java); 
Powermock.expectNew(SomeOtherClass.java).andReturn(soc).anyTimes(); 

expectNew()預計在那個特定的類'new'調用和返回,我們要回報,這對我們來說必須是嘲笑的對象,這樣,每當新的具體類調用模擬注入的對象。

希望這會有所幫助!

祝你好運!