如何覆盖正在测试的类所调用的单元测试中的方法

时间:2016-05-15 06:53:30

标签: java unit-testing junit mocking easymock

我正在测试A类功能func1。

Func1有一个B类局部变量,并调用B&#39的函数func2。代码看起来像这样:

public Class A
{
    public func1()
    {
       B object = new B();
       int x = object.func2(something);
    }
}

当我在单元测试中测试func1时,我不想让func2被调用。

所以我试图在测试中做这样的事情:

B textObject = new B()
{
   @override
   int func2(something)
   {
      return 5;
   }
}

但它仍然在B类中调用func2。请建议如何处理。

2 个答案:

答案 0 :(得分:2)

如果要覆盖(?![^<]*>|[^<>]*<\/)构造函数调用 - 将其放在自己的方法中。

new B()

在测试中,您可以覆盖public Class A { public func1() { B object = newB(); int x = object.func2(something); } protected B newB(){ return new B(); } } 构造函数调用。

B

然后使用public class APartitialMock extends A { protected B newB(){ return new BMock(); } } public class BMock extends B { int func2(something) { return 5 } } 来测试APartitialMock的{​​{1}}。

PS 如果您可以或想要使用框架,请查看powermock - Mock Constructor

答案 1 :(得分:0)

  

我可以将B作为A中的类变量,但这似乎没有帮助   无论是。在这种情况下你会建议什么?

如果你把B作为一个类变量,那么你可以模拟B,并在A的测试对象中“交换”它。
也许不是很优雅,但又快又简单。

一个例子:

public class B {
    int func2(int something){
        return 3*something;
    }
}
public class A
{
    // declare it as protected - a test need to have access to this field to replace it
    protected B object = new B();

    public int func1()
    {
       int x = object.func2(22);
       return x;
    }
}

测试:

import static org.mockito.Mockito.*;
import static org.junit.Assert.*;

import org.junit.Test;

public class ATest {

    @Test
    public void test() {
        A myA = new A();
        B myB = mock(B.class);

        // dummy function
        when(myB.func2(anyInt())).thenReturn(20);

        // replace B with mocked B
        myA.object = myB;

        int actual = myA.func1();

        assertEquals(20, actual);
    }
}