簡體   English   中英

單元測試:測試具有外部方法的類

[英]Unit Testing: Testing a class which has an outside method

class A {
    int a;

    public int add() {
        B b = new B();
        a = b.calculate(4, 5);
        return a;
    }
}

class B {
    public int calculate(int x, int y) {
        return x * y;
    }
}

我想測試A類,而又不想測試add()方法中的b.calculate()。 所以我需要模擬B類。

這是我的代碼。

@Mock
B bclass;

A aclass;

@Before
public void setUp() {
    bclass = new B();
    aclass = new A();
}

@Test
public void testAClass() {
    when(bclass.calculate(4, 5)).thenReturn(45);
    assertEquals(45, aclass.add());
}

測試失敗。 它出什么問題了?

看來您正在使用Mockit框架。 您可以嘗試執行以下操作:

new MockUp<B>() {

            @Mock
            int calculate(int x, int y) // no access modifier required
            {
               return 45; // your value
            }
        };

@Mock注釋已經生成了B的實例。我們無需在此處再次創建實例。 另外,請確保使用“有效運行器”或“規則”進行注釋。

@RunWith(MockitoJUnitRunner.class)

讓我們知道顯示的錯誤,如果它不起作用。 您也可以參考下面的鏈接使用模仿。

http://www.vogella.com/tutorials/Mockito/article.html#mockito_usage

您的問題是A類對B類的隱藏依賴關系

@Jens的答案向您展示了如何使用 PowerMock 解決此問題,但我認為這是對您的不良設計的屈服。

更好的方法是通過將類B的實例注入到類A對象中A最好作為構造函數參數)來使此依賴關系明確
最好使用諸如guicespring類的依賴項注入框架
您可以使用regulat Mockito構造。

class A {
    int a;
    private final B b;
    public A(B b){
      this.b=b;
    }
    public int add() {
        a = b.calculate(4, 5);
        return a;
    }
}

@Mock
B bclass;

A aclass;

@Before
public void setUp() {
    aclass = new A(bclass);
}

@Test
public void testAClass() {
    when(bclass.calculate(4, 5)).thenReturn(45);
    assertEquals(45, aclass.add());
}

我不確定Mockito是否可行。 使用PowerMockito可以工作:

@RunWith(PowerMockRunner.class)
@PrepareForTest(A.class)
public class BTest {

    A aclass;

    B bMock;

    @Before
    public void setUp() throws Exception {
        bMock = PowerMockito.mock(B.class);
        PowerMockito.whenNew(B.class).withNoArguments().thenReturn(bMock);
        aclass = new A();
    }

    @Test
    public void testAClass() {
        Mockito.when(bMock.calculate(4, 5)).thenReturn(45);
        Assert.assertEquals(45, aclass.add());
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM