[英]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.