我正在学习Mockito.我在为嵌套对象创建模拟时遇到问题.看到
public interface BaseManager {
public Query createQuery(String queryString);
}
Run Code Online (Sandbox Code Playgroud)
和一个实现类
public class BaseManagerImpl implements BaseManager {
@Autowired
private SessionFactory sessionFactory;
// ...
}
Run Code Online (Sandbox Code Playgroud)
模块级别的hibernate管理器,例如:
public interface RegistrationManager {
@Transactional
public List<Country> getCountries();
}
Run Code Online (Sandbox Code Playgroud)
和一个实现类
public class RegistrationManagerImpl implements RegistrationManager {
@Autowired
private BaseManager baseManager;
// ...
}
Run Code Online (Sandbox Code Playgroud)
现在我在创建模拟基础管理器方面遇到了问题.我的测试类是:
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
}
Run Code Online (Sandbox Code Playgroud)
问题: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
}
Run Code Online (Sandbox Code Playgroud)
希望这是你正在寻找的!
问题是您正在创建一个模拟BaseManager但只有BaseManagerImpl一个 SessionFactory字段。Mockito 不知道BaseManagerImpl。在您的代码中,您创建了两个完全独立的模拟。
单元测试是关于测试一个单元。所以你应该分别测试BaseManagerImpl和RegistrationManagerImpl。
所以你BaseManagerImpl先测试一下:
public class BaseManagerImplTest {
private BaseManagerImpl target;
// ...
}
Run Code Online (Sandbox Code Playgroud)
然后你测试RegistrationManagerImpl:
public class RegistrationManagerImplTest {
private RegistrationManagerImpl target;
// ...
}
Run Code Online (Sandbox Code Playgroud)
target我建议您应该在测试类中使用测试目标的名称或类似名称,因为这将使您的代码更易于阅读。
另一件事:如果你测试一个对象,它的所有依赖项都应该被模拟,但你不应该关心模拟的依赖项。您只需模拟他们的方法调用,例如:
Mockito.when(myMock.someMethod()).thenReturn(someResultObject);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
17032 次 |
| 最近记录: |