2015-10-19 75 views
0

我正在爲使用mockito和testng的類編寫測試。要測試的類有幾個依賴需要被模擬和注入。要測試的類具有以下輪廓如何模擬注入模擬對象的方法

class A{ 
    @Autowired 
    private Object1; 
    @Autowired 
    private Object2; 
    Object3 methodToBeTested(){ 
      //some code 
      method2(); 
      //some code 
    } 
    boolean method2(){ 
     //some calls to Database that are not operational 
    } 
} 

在我的測試類,我聲明的對象Object1和Object2的是嘲笑和初始化它們如下

@Mock 
Object1 ob1; 
@Mock 
Object2 ob2; 
@InjectMocks 
A a = new A(); 

@Test 
public void ATest(){ 
    Object3 ob3; 
    when(ob1.someMethod()).thenReturn(someObject); 
    when(ob2.someMethos()).thenReturn(someOtherObject); 
    ob3 = a.methodToBeTested(); 
    assertNotNull(ob3); 
} 

問題就出現了,因爲我有嘲笑對類A的方法2的調用,以及它有一些調用在測試階段不可操作。 mockito也不允許一個對象同時擁有@Mocks和@InjectMocks註釋。有沒有一種方法可以在不修改A類代碼的情況下進行測試(不想僅僅爲了測試而修改它)。

+2

http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html#13 –

+0

@JBNizet想讓這個答案,我可以upvote它?顯然,這是正確的。 –

+0

@DavidWallace完成。謝謝你讓我不那麼懶惰:) –

回答

2

你需要刺探真實的目的上,如the documentation解釋說:

@Mock 
Object1 ob1; 

@Mock 
Object2 ob2; 

@InjectMocks 
A a = new A(); 

@Test 
public void ATest(){ 
    A spy = spy(a); 

    doReturn(true).when(spy).method2(); 

    Object3 ob3; 
    when(ob1.someMethod()).thenReturn(someObject); 
    when(ob2.someMethos()).thenReturn(someOtherObject); 

    ob3 = spy.methodToBeTested(); 

    assertNotNull(ob3); 
} 

注意,這具有指示代碼味道的一個很好的機會。也許應該把這個method2()移到另一個類,A將依賴於這個類。

+0

upvote表示代碼味道。如果您需要監視,99%的案例需要重構您的代碼 –

+0

@JB Nizet謝謝您解決了我的問題! –

+0

@SarthakNigam那麼你應該*接受*答案來標記你的問題爲答案。見http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235#5235 –