单元测试:测试具有外部方法的类

时间:2018-08-29 05:56:22

标签: java android unit-testing android-testing

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());
}

测试失败。怎么了?

4 个答案:

答案 0 :(得分:1)

您似乎正在使用Mockit框架。 您可以尝试执行以下操作:

new MockUp<B>() {

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

答案 1 :(得分:1)

@Mock注释已经生成了B的实例。我们在这里无需再次创建实例。另外,请确保使用“有效运行器”或“规则”进行注释。

@RunWith(MockitoJUnitRunner.class)

如果它不起作用,请告诉我们显示的错误。您也可以参考下面的链接,了解如何使用Mockito。

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

答案 2 :(得分:1)

您的问题是类A对类B隐藏依赖性

@Jens的答案向您展示了如何使用 PowerMock 解决此问题,但我认为这是对您不良设计的屈服。

更好的方法是通过将类B的实例注入到类A的对象中(最好作为构造函数参数)来使此依赖 explicit
最好使用依赖注入框架,例如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());
}

答案 3 :(得分:0)

我不确定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());
    }
}