使用 Mockito 测试方法调用
Test methods invocation with Mockito
我在我的 DAO 和服务层使用 Spring。现在我尝试使用 Mockito 框架测试这一层。我想要的只是检查是否调用了适当的方法。
这是我模拟所有必需依赖项的配置:
@Configuration
public class MockConfig
{
@Bean
public EntityManagerFactory entityManagerFactory()
{
return mock(EntityManagerFactory.class);
}
@Bean
public BaseRepositoryImpl baseRepositoryImpl()
{
return mock(BaseRepositoryImpl.class);
}
@Bean
public BaseServiceImpl baseServiceImpl()
{
return mock(BaseServiceImpl.class);
}
}
这就是我尝试测试的方式:
@ContextConfiguration(classes = MockConfig.class)
@RunWith(SpringJUnit4ClassRunner.class)
public class BaseServiceTest
{
@Autowired
private BaseService<Entity> service;
@Autowired
private BaseRepository<Entity> repository;
@Test
public void testSave()
{
Entity entity = new Entity("testId", "testName");
service.save(entity);
verify(service).save(entity);
//try to test that Service calls appropriate method on Repository
verify(repository).save(entity);
}
但是 Repository
模拟测试失败。我想确保Service
调用适当的方法,然后它的Repository
(即Service
中的@Autowired
)依次调用适当的方法。
但似乎我误解了一些关于模拟的东西。如果有人知道如何实现这一点,请提供帮助。提前致谢。
在这种情况下,您不应该嘲笑您的服务。您的服务是被测对象;你需要它的实际实例。
@Configuration
@ComponentScan(basePackages = {"my.package.service"})
public class MockConfig {
@Bean
public BaseRepositoryImpl baseRepositoryImpl() {
return mock(BaseRepositoryImpl.class);
}
}
那么在你的测试中:
@Autowired
@InjectMocks
private BaseService<Entity> service;
最后,删除 verify(service).save(entity);
我在我的 DAO 和服务层使用 Spring。现在我尝试使用 Mockito 框架测试这一层。我想要的只是检查是否调用了适当的方法。
这是我模拟所有必需依赖项的配置:
@Configuration
public class MockConfig
{
@Bean
public EntityManagerFactory entityManagerFactory()
{
return mock(EntityManagerFactory.class);
}
@Bean
public BaseRepositoryImpl baseRepositoryImpl()
{
return mock(BaseRepositoryImpl.class);
}
@Bean
public BaseServiceImpl baseServiceImpl()
{
return mock(BaseServiceImpl.class);
}
}
这就是我尝试测试的方式:
@ContextConfiguration(classes = MockConfig.class)
@RunWith(SpringJUnit4ClassRunner.class)
public class BaseServiceTest
{
@Autowired
private BaseService<Entity> service;
@Autowired
private BaseRepository<Entity> repository;
@Test
public void testSave()
{
Entity entity = new Entity("testId", "testName");
service.save(entity);
verify(service).save(entity);
//try to test that Service calls appropriate method on Repository
verify(repository).save(entity);
}
但是 Repository
模拟测试失败。我想确保Service
调用适当的方法,然后它的Repository
(即Service
中的@Autowired
)依次调用适当的方法。
但似乎我误解了一些关于模拟的东西。如果有人知道如何实现这一点,请提供帮助。提前致谢。
在这种情况下,您不应该嘲笑您的服务。您的服务是被测对象;你需要它的实际实例。
@Configuration
@ComponentScan(basePackages = {"my.package.service"})
public class MockConfig {
@Bean
public BaseRepositoryImpl baseRepositoryImpl() {
return mock(BaseRepositoryImpl.class);
}
}
那么在你的测试中:
@Autowired
@InjectMocks
private BaseService<Entity> service;
最后,删除 verify(service).save(entity);