我对Mockito和带有“间谍”注释的字段有点混乱。
我想测试这个类:
@Service
public class CategoryServiceImpl implements CategoryService {
@Autowire
private CategoryRepository categoryRepository;
private BoundMapperFacade<CategoryDTO, Category> boundMapper;
@Autowired
public void createMapper(final Mapper mapper) {
boundMapper = mapper.getMapperFactory().getMapperFacade(
CategoryDTO.class, Category.class);
}
// Rest of methods...
}
因此,我创建了一个测试类,如下所示:
@RunWith(MockitoJUnitRunner.class)
public class CategoryServiceImplTest {
@Mock
private CategoryRepository categoryRepository;
@Spy
private Mapper mapper;
@Spy
private BoundMapperFacade<CategoryDTO, Category> boundMapper;
@InjectMocks
private CategoryServiceImpl categoryServiceImpl;
// Rest of methods...
}
当Mockito实例categoryServiceImpl将categoryRepository作为模拟类注入时,但它不知道如何创建boundMapper。这个类依赖于mapper,所以我重写了代码:
@RunWith(MockitoJUnitRunner.class)
public class CategoryServiceImplTest {
@Mock
private CategoryRepository categoryRepository;
@Spy
private Mapper mapper;
private BoundMapperFacade<CategoryDTO, Category> boundMapper = spy(mapper.getMapperFactory().getMapperFacade(
CategoryDTO.class, Category.class));
@InjectMocks
private CategoryServiceImpl categoryServiceImpl;
// Rest of methods...
}
但是现在的问题是在Mockito注入映射器之前执行了边界映射器的创建,所以我得到了一个NullPointerException。
那么,有没有办法创建一个依赖于另一个间谍类的间谍类,并最终将最后一个注入标记为@InjectMocks的字段中?
如果您有一个依赖于mock或spy的spy,我见过的唯一方法是在< code>@Before修饰函数中。
@RunWith(MockitoJUnitRunner.class)
public class CategoryServiceImplTest {
@Mock
private CategoryRepository categoryRepository;
@Spy
private Mapper mapper;
private BoundMapperFacade<CategoryDTO, Category> boundMapper = ;
@InjectMocks
private CategoryServiceImpl categoryServiceImpl;
@Before
public void setup() {
boundMapper = spy(mapper
.getMapperFactory()
.getMapperFacade(CategoryDTO.class, Category.class)
);
}
// Rest of methods...
}
我不确定这如何与@InjectMocks
一起工作,所以这可能是需要研究的东西。如果类别服务Impl
依赖于它,则您可以在初始化边界映射器
后运行它的非装饰器版本。
Mockito——我知道间谍在对象上调用实际方法,而模拟在双对象上调用方法。此外,除非有代码气味,否则要避免间谍。然而,间谍是如何工作的?我应该在什么时候使用他们?它们与模拟有什么不同?
我努力嘲笑一个华丽的存储库。以下是实体: 简单存储库: 这是资源: 和一个简单的测试,我尝试模拟存储库: 测试失败,因为响应列表是
我对莫基托有疑问。我想测试这个简单的类: 我写了这个简单的测试: 此测试运行时没有错误。我等待它没有编译,因为没有任何对userService方法的调用…
当我试图在单元测试中窥探一个对象时,我得到了一个异常。这是我的单元测试文件: 我在assign bookInfoParams Spy链接处遇到异常:
问题内容: 我有内部类的课程,如下所示: 模仿测试如下所示:build.gradle: 测试: 第一次测试正在按预期方式工作。第二个永远不会被检测为“已调用”,尽管在日志中我看到的是。有什么问题吗?:) 谢谢! 问题答案: 怎么了? 好吧,这里的问题非常微妙,当您调用时,会在实例背后创建某种装饰器,以允许监视实例上的所有方法调用。因此,您可以检查给定方法被调用了多少次, 但是在装饰器 上 却 没有
虽然这个问题已经得到了回答,但我仍然不清楚在嘲弄中应该使用哪一个 当参考。我看不出它们之间有什么区别。 留档为是说 的文档中说 的留档是说 这清楚地表明,这两者之间没有区别。那么,我们为什么要采用这三种嘲弄策略,以及在当时和何时使用它们之间的具体区别。 如果它是一个带有示例代码的答案,那将非常有帮助。