簡體   English   中英

Mockito - 創建嵌套的模擬對象

[英]Mockito - Creating nested mock objects

我正在學習Mockito。 我在為嵌套對象創建模擬時遇到問題。 看到

public interface BaseManager {
    public Query createQuery(String queryString);
}

和一個實現類

public class BaseManagerImpl implements BaseManager {
    @Autowired
    private SessionFactory sessionFactory;
    // ...
}

模塊級別的hibernate管理器,例如:

public interface RegistrationManager {
    @Transactional
    public List<Country> getCountries();
}

和一個實現類

public class RegistrationManagerImpl implements RegistrationManager {
    @Autowired
    private BaseManager baseManager;
    // ...
}

現在我在創建模擬基礎管理器方面遇到了問題。 我的測試類是:

 public class MockitoTest {
    private RegistrationManager registrationManager = new RegistrationManagerImpl();

    @Mock private BaseManager baseManager;

    @Mock private SessionFactory sessionFactory;

    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);
    //  baseManager.setSessionFactory(sessionFactory);
        registrationManager.setBaseManager(baseManager);
    }
    // ...
    // @Test
}

問題: sessionFactory未在baseManager中實例化。 請幫助創建模擬對象。 提前致謝!

您必須在要測試的類之前放置@InjectMocks注釋並模擬basemanger或sessionFactory調用的方法。

public class MockitoTest {
    @InjectMocks
    private RegistrationManager registrationManager = new RegistrationManagerImpl();

    @Mock private BaseManager baseManager;

    @Mock private SessionFactory sessionFactory;

    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);
    //  baseManager.setSessionFactory(sessionFactory);
        registrationManager.setBaseManager(baseManager);

        Mockito.when(baseManager.yourMethod()).thenReturn(someObject);
    }
    // ...
    // @Test
}

希望這是你正在尋找的!

問題是您正在創建BaseManager的模擬,但只有BaseManagerImpl具有SessionFactory字段。 Mockito不了解BaseManagerImpl 在您的代碼中,您創建兩個完全獨立的模擬。

單元測試是關於測試一個單元 所以你應該分別測試BaseManagerImplRegistrationManagerImpl

所以你首先測試BaseManagerImpl

public class BaseManagerImplTest {

    private BaseManagerImpl target;

    // ...
}

然后你測試RegistrationManagerImpl

public class RegistrationManagerImplTest {

    private RegistrationManagerImpl target;

    // ...
}

我建議您在測試類中使用名稱target或類似的測試目標,因為它會使您的代碼更容易閱讀。

另一件事:如果你測試一個對象,它的所有依賴項都應該被模擬,但你不應該關心模擬的依賴項。 你只是模擬他們的方法調用,如:

Mockito.when(myMock.someMethod()).thenReturn(someResultObject);

你不能注入一個mockSessionFactorymockBaseManager

在測試RegistrationManagerImpl ,您只需要mock BaseManager 您可以使用方法存根,以便在從RegistrationManagerImpl方法調用這些方法時,方法BaseManager將返回存根值。 所以,如果你有一個RegistrationManagerImpl

public class RegistrationManagerImpl implements RegistrationManager {
    @Autowired
    private BaseManager baseManager;
    // ...
    public String doSomething(){
         return baseManager.process();  
    }
}

你可以寫下你的MockitoTest

public class MockitoTest {
    @InjectMocks
    private RegistrationManager registrationManager = new RegistrationManagerImpl();

    @Mock private BaseManager baseManager;

    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);

    }
    // ...
    @Test
    public void test() {
    when(baseManager.process()).thenReturn("hello");

    assertEquals("hello", registrationManager.doSomething());
    }
}

在測試BaseManager ,你需要使用SeesionFactory mock

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM