2014-03-25 27 views
0

有沒有人知道爲什麼在這個例子中,當運行「ATest」時,我得到一行null「return b.getBAutoWiredObject()。getString();」autowired字段的模擬在單元測試中爲null

任何有關這方面的意見將不勝感激。

@RunWith(MockitoJUnitRunner.class) 
public class ATest { 
    @Mock 
    private A a; 

    @Test 
    public void testMethod() { 
     String testedString = a.method(); 

     assertEquals("blah", testedString); 
    } 
} 

@Service("A") 
public class A { 
    public String method() { 
     B b = new B(); 

     return b.getBAutoWiredObject().getString(); 
    } 
} 

@Component 
public class B { 
    @Autowired 
    @Qualifier("Bautowire") 
    private BAutoWiredObject bAutoWiredObject; 

    public BAutoWiredObject getBAutoWiredObject() { 
     return bAutoWiredObject; 
    } 
} 

@Service("Bautowire") 
public class BAutoWiredObject { 
    private String string = new String("blah"); 

    public void getString() { 
     return string; 
    } 
} 

回答

0

通常情況下,答案應該是它的null因爲你自己創建的B實例。 Spring至少沒有涉及到,所以它沒有自動裝配任何東西。

在這種情況下,你的A對象是@Mock和嘲笑通常被實現在具有返回類型,它是引用類型的任何方法返回null你的method()實現實際上並沒有被調用。模擬的實現是。

這是假設您的測試實際上將編譯並且與@Test註釋的方法有效。


assertEquals(testedString, "blah"); 

應該是

assertEquals("blah", testedString); 

第一個參數應是預期的值和所述第二應的實際值。

+0

是的,你是對的,斷言線是不正確的,我沒有關注,因爲它不是我的問題的重點。 那麼,爲了讓我的模擬「A」對象能夠沿着層次結構並從「BAutoWiredObject」中獲取字符串,我需要做些什麼? – MacAttack

+0

@MacAttack你不會。如果你正在測試'A',你不應該嘲笑它。如果你正在做一些集成測試和嘲諷'A',那麼運行A代碼並不重要,你應該設置期望值。 –

+0

這可以用一個when()來解決嗎?即。我在我的測試類中添加了B作爲模擬對象,然後在(B.getBAutoWiredObject()。getString())時返回。 – MacAttack