亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

用Mockito模擬靜態方法

用Mockito模擬靜態方法

守候你守候我 2019-06-06 13:51:50
用Mockito模擬靜態方法我寫了一家工廠來生產java.sql.Connection物體:public class MySQLDatabaseConnectionFactory implements DatabaseConnectionFactory {     @Override public Connection getConnection() {         try {             return DriverManager.getConnection(...);         } catch (SQLException e) {             throw new RuntimeException(e);         }     }}我想驗證傳遞給DriverManager.getConnection,但我不知道如何模擬靜態方法。我使用JUnit 4和Mockito作為測試用例。有一個好的方法來模擬/驗證這個特定的用例嗎?
查看完整描述

3 回答

?
www說

TA貢獻1775條經驗 獲得超8個贊

使用PowerMockito在莫基托頂上。

示例代碼:

@RunWith(PowerMockRunner.class)@PrepareForTest(DriverManager.class)public class Mocker {

    @Test
    public void shouldVerifyParameters() throws Exception {

        //given
        PowerMockito.mockStatic(DriverManager.class);
        BDDMockito.given(DriverManager.getConnection(...)).willReturn(...);

        //when
        sut.execute(); // System Under Test (sut)

        //then
        PowerMockito.verifyStatic();
        DriverManager.getConnection(...);

    }

更多信息:


查看完整回答
反對 回復 2019-06-06
?
慕無忌1623718

TA貢獻1744條經驗 獲得超4個贊

避免使用靜態方法的典型策略是創建包裝對象并使用包裝對象。

包裝器對象成為真正的靜態類的外觀,您不需要測試這些類。

包裝器對象可能類似于

public class Slf4jMdcWrapper {
    public static final Slf4jMdcWrapper SINGLETON = new Slf4jMdcWrapper();

    public String myApisToTheSaticMethodsInSlf4jMdcStaticUtilityClass() {
        return MDC.getWhateverIWant();
    }}

最后,測試中的類可以使用這個單例對象,例如,具有一個用于實際使用的默認構造函數:

public class SomeClassUnderTest {
    final Slf4jMdcWrapper myMockableObject;

    /** constructor used by CDI or whatever real life use case */
    public myClassUnderTestContructor() {
        this.myMockableObject = Slf4jMdcWrapper.SINGLETON;
    }

    /** constructor used in tests*/
    myClassUnderTestContructor(Slf4jMdcWrapper myMock) {
        this.myMockableObject = myMock;
    }}

在這里,您可以很容易地測試一個類,因為您不直接使用帶有靜態方法的類。

如果您使用的是CDI,并且可以使用@Inject注釋,那么它就更容易了。只需讓包裝器bean@ApplicationScoped,將它注入到協作器中(您甚至不需要復雜的構造器進行測試),然后繼續進行模擬。


查看完整回答
反對 回復 2019-06-06
  • 3 回答
  • 0 關注
  • 2855 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號