2017-07-25 62 views
1
public class A{ 
    private final B b; 
    public void meth() { 
     //Some code 
     Integer a = b.some_method(a,fun(b)); 
     //Some code 
    } 
    private fun(int b) { 
    return b; 
    } 
} 
when(b.some_method(anyInt(),anyInt())).thenReturn(100) 

如何在編寫A類單元測試時模擬外部依賴關係。當我以上述方式模擬依賴關係時,「a」的值未按預期分配給100。如何模擬最終對象的外部依賴關係?

+0

當你創建一個類B的模擬(B bock = mock(B.class))之後,你必須注入它以某種方式進入類A的實例,使用構造函數(A a = new A(bmock))或setter方法(A a = new A(); a.setB(bmock))。 –

+0

似乎沒有工作,仍然沒有按預期工作。 – user304611

回答

0

您可以使用powermock庫來模擬最終對象。這是從他們的wiki實施。

測試類:

public class StateFormatter { 

private final StateHolder stateHolder; 

public StateFormatter(StateHolder stateHolder) { 
    this.stateHolder = stateHolder; 
} 

public String getFormattedState() { 
    String safeState = "State information is missing"; 
    final String actualState = stateHolder.getState(); 
    if (actualState != null) { 
     safeState = actualState; 
    } 
    return safeState; 
} 
} 

測試片段:

StateHolder stateHolderMock = createMock(StateHolder.class); 
StateFormatter tested = new StateFormatter(stateHolderMock); 

expect(stateHolderMock.getState()).andReturn(expectedState); 

     // PowerMock.replay(..) must be used. 
replay(stateHolderMock); 

你可以找到full sample here

  1. 你必須A類改變你的構造函數參數。
  2. 通過傳遞使用powermock
1

事實上的Jakub的答案是正確的創建mock對象B創建一個對象。也許你需要一個例子來了解如何去做。檢查我的示例的主要方法和構造函數。

public class A { 
    private final B b; 

    public A(B b) { 
     this.b = b; 
    } 

    public void meth() { 
     //Some code 
     Integer a = b.some_method(5,fun(5)); 
     //Some code 
     System.out.println(a); 
    } 
    private int fun(int b) { 
     return b; 
    } 

    public static void main(String[] args) { 
     B b = Mockito.mock(B.class); 

     when(b.some_method(anyInt(), anyInt())).thenReturn(100); 

     new A(b).meth(); 
    } 

} 

隨着你必須集B與模擬(見主要方法倒數第三行)構造函數。 當你運行主要方法時,你會看到System.out的輸出,它是100.