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 允許模擬構造新對象并不意味著我們應該這樣做。
如果遵循正確的設計原則,那么確實不需要這樣的黑客攻擊。
添加回答
舉報