2017-08-25 63 views
0

我正在使用easymock和powermock編寫下面的Class B的isRegisteredUSer()的單元測試用例。如何模擬類A的getUserInformation()並返回一個模擬的UserAccessBean?如何使用powermock-easymock來模擬正在測試的方法中的另一個類方法調用?

class A{ 
    private int userId; 
    A(int userId){ 
     this.userId = userId; 
    } 
    public UserAccessBean getUserInformation(){ 
     UserAccessBean userAB = new USerAccessBean().findByUserId(userId); 
     return userAB; 
    } 
} 


Class B{ 
    public static boolean isRegisteredUSer(int userId){ 
    A a = new A(userId); 
    UserAccessBean userAB = a.getUserInformation(); 
    if(userAB.getUserType().equals("R")){ 
     return true; 
    } 
    return false; 
} 


JUnit 

    public class BTest extends EasyMockSupport{ 
    UserAccessBean userAB = null; 
    A a = null; 
    int userId = 12345; 
    @Before 
    public void setUp() throws Exception { 
     userAB = new UserAccessBean(); 
    } 

     @Test 
    public void when_UserDesctiptionIsR_Expect_True_FromIsRegisteredUser() throws Exception{ 
     //data setup 
     userAB.setDescription("R"); 
     A a = new A(12345); 

     EasyMock.expect(a.isRegisteredUser()).andReturn(userAB); 
     PowerMock.replayAll(); 

     Boolean flag = B.isRegisteredUser(userId); 
     assertEquals(flag, true); 
     PowerMock.verifyAll(); 

    } 
    } 

即使我使用EasyMock.expect()嘲笑getUserInformation()方法調用,我的控制檯內getUserInformation會()當我運行我的JUnit。

有人可以幫我嘲笑正在測試的方法(Class B的isRegisteredUSer)的另一個類函數方法(Class A的getUserInformation)調用嗎?

+0

Powermock提供了一個「mockNew」,但您應該重構代碼以簡化測試,請參閱https://github.com/powermock/powermock/wiki/mockconstructor – 2017-08-25 18:50:55

回答

0

請下次複製實際工作代碼。你的代碼有很多錯別字和異常,這使得它很難解決。不過,我想你想要一個正常的EasyMock A和一個新的B模擬。下面的代碼應該回答你的問題

@RunWith(PowerMockRunner.class) 
@PrepareForTest({A.class, B.class}) 
public class BTest extends EasyMockSupport { 
    UserAccessBean userAB = new UserAccessBean(); 
    A a; 
    int userId = 12345; 

    @Test 
    public void when_UserDesctiptionIsR_Expect_True_FromIsRegisteredUser() throws Exception { 
    //data setup 
    userAB.setDescription("R"); 
    A a = createMock(A.class); 

    expect(a.getUserInformation()).andReturn(userAB); 
    replayAll(); 

    PowerMock.expectNew(A.class, userId).andReturn(a); 
    PowerMock.replay(A.class); 

    Boolean flag = B.isRegisteredUser(userId); 
    assertEquals(flag, true); 
    PowerMock.verifyAll(); 
    verifyAll(); 
    } 
} 

我不過強烈建議A被注入B和擺脫靜態方法。這將擺脫PowerMock並簡化代碼。

相關問題