我正在编写类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()的对象。
我该如何嘲笑?
我应该在测试班级中写什么。
模拟类的初始化,以便在执行测试时使用模拟
@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);
}
}