当前位置: 首页 > 知识库问答 >
问题:

间谍对莫克托的依赖

全卜霸
2023-03-14

我对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的字段中?

共有1个答案

法浩壤
2023-03-14

如果您有一个依赖于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: 测试: 第一次测试正在按预期方式工作。第二个永远不会被检测为“已调用”,尽管在日志中我看到的是。有什么问题吗?:) 谢谢! 问题答案: 怎么了? 好吧,这里的问题非常微妙,当您调用时,会在实例背后创建某种装饰器,以允许监视实例上的所有方法调用。因此,您可以检查给定方法被调用了多少次, 但是在装饰器 上 却 没有

  • 虽然这个问题已经得到了回答,但我仍然不清楚在嘲弄中应该使用哪一个 当参考。我看不出它们之间有什么区别。 留档为是说 的文档中说 的留档是说 这清楚地表明,这两者之间没有区别。那么,我们为什么要采用这三种嘲弄策略,以及在当时和何时使用它们之间的具体区别。 如果它是一个带有示例代码的答案,那将非常有帮助。