1 回答

TA贡献1998条经验 获得超6个赞
模拟类的初始化,以便在执行测试时使用模拟
@RunWith(PowerMockRunner.class)
@PrepareForTest({ClassA.class}) //prepare the class creating the new instance of ClassB for test, not the ClassB itself.
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);
}
}
参考如何模拟新对象的构造
话虽如此,理想情况下目标类应该通过构造函数注入遵循显式依赖原则
public class ClassA {
final ClassB objectOfB;
public ClassA(ClassB objectOfB) {
this.objectOfB = objectOfB;
}
public int add(int a, int b) {
int addition = objectOfB.performCalculation(a,b);
return addition;
}
}
允许类显式地声明执行其设计功能所依赖的内容。
它还允许控制反转和松散耦合,这使得类更灵活地维护和测试
@RunWith(PowerMockRunner.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);
ClassA objA = new ClassA(objB);
//Act
int actual = objA.add(5, 10);
//Assert
assertEquals(expected, actual);
}
}
仅仅因为 PowerMockito 允许模拟构造新对象并不意味着我们应该这样做。
如果遵循正确的设计原则,那么确实不需要这样的黑客攻击。
添加回答
举报