如何模拟从类级别对象调用的方法

问题描述 投票:0回答:1

我正在编写类A的单元测试,我想模拟一个方法,但是该方法是从类级别对象调用的,因此我将如何模拟它。

让我从示例中进行解释

正在测试的A类。

public class ClassA {
    ClassB objectOfB = new ClassB();
    public int add(int a, int b) {
        int addition = objectOfB.performCalculation(a,b);
        return addition;
    }
}

B类,具有一些业务逻辑。

  public class ClassB {
    public int performCalculation(int a, int b) {
        int c = a+b;
        System.out.println("I am not mocked, I am actual call");
        System.out.println("Returning " + c + " From ClassB");
        return c;
    }
  }

书面测试

import static org.junit.Assert.*;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

@RunWith(PowerMockRunner.class)
@PrepareForTest({ClassA.class, ClassB.class})
public class ClassATest {
    @InjectMocks
    ClassA objA = new ClassA();

    @Test
    public void testAddFromClassA() throws Exception {
        ClassB objB = Mockito.mock(ClassB.class);
        Mockito.when(objB.performCalculation(5, 10)).thenReturn(15);
        int result = objA.add(5, 10);
        assertEquals(result, 15);
    }

}

测试结果:

此测试是通过的,但是它不是在模拟ClassB的方法,而是在执行实际的调用。


要求:

[在编写测试时,我想模拟以下行:objectOfB.performCalculation(a,b);从类A,但是您可以看到在类级别创建了classB()的对象。

我该如何嘲笑?

我应该在测试班级中写什么。

enter image description here

java unit-testing mockito powermockito
1个回答
0
投票

模拟类的初始化,以便在执行测试时使用模拟

@RunWith(PowerMockRunner.class)
@PrepareForTest({ClassA.class})
public class ClassATest {
    @Test
    public void testAddFromClassA() throws Exception {
        int expected = 15;
        ClassB objB = Mockito.mock(ClassB.class);
        Mockito.when(objB.performCalculation(5, 10)).thenReturn(expected);

        //mocking initialization of ClassB class withing ClassA class
        PowerMockito.whenNew(ClassB.class).withNoArguments().thenReturn(objB);

        ClassA objA = new ClassA();

        //Act
        int actual = objA.add(5, 10);

        //Assert
        assertEquals(expected, actual);
    }
}

参考How to mock construction of new objects

© www.soinside.com 2019 - 2024. All rights reserved.