[英]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
。 在您的代碼中,您創建兩個完全獨立的模擬。
單元測試是關於測試一個單元 。 所以你應該分別測試BaseManagerImpl
和RegistrationManagerImpl
。
所以你首先測試BaseManagerImpl
:
public class BaseManagerImplTest {
private BaseManagerImpl target;
// ...
}
然后你測試RegistrationManagerImpl
:
public class RegistrationManagerImplTest {
private RegistrationManagerImpl target;
// ...
}
我建議您在測試類中使用名稱target
或類似的測試目標,因為它會使您的代碼更容易閱讀。
另一件事:如果你測試一個對象,它的所有依賴項都應該被模擬,但你不應該關心模擬的依賴項。 你只是模擬他們的方法調用,如:
Mockito.when(myMock.someMethod()).thenReturn(someResultObject);
你不能注入一個mock
的SessionFactory
成mock
的BaseManager
。
在測試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.