Mockito不会在实际方法中模拟



我在下面的测试中嘲笑authservice,并设置authservice.checkauthority(任何(userauthority.class))为" true"。它实际上是在设置的,但是在实际方法中(authservice.checkauthority(userauthority.comment_access)),它将值视为false。

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(ApplicationRunner.class)
@WebAppConfiguration
@Transactional
public class TagsTest extends BaseWebTest {
    @Autowired
    private TagService tagService;
    @Autowired
    private TagRepository repository;
    UserDetailsDto currentUser;
    @Autowired
    protected AuthService authService;
    @Autowired
    protected StringRedisTemplate stringRedisTemplate;
    @Autowired
    protected FilterChainProxy filterChainProxy;
    @Autowired
    protected WebApplicationContext context;
    protected static MockMvc mvc;
    @Before
    @Override
    public void setUp() {
        MockitoAnnotations.initMocks(this);
        mvc = MockMvcBuilders.webAppContextSetup(context)
                .dispatchOptions(true)
                .addFilters(filterChainProxy)
                .build();
        authService = Mockito.mock(AuthService.class);
        Mockito.reset(authService);
        when(authService.getCurrentUser()).then(i->(getCurrentUser()));            
        when(authService.checkAuthority(any(UserAuthority.class))).
                                        thenReturn(true);
        login(WORKFLOW_USER);
    }

任何帮助将不胜感激。预先感谢!

您的特定问题可以通过删除此任务解决:

authService = Mockito.mock(AuthService.class);

您的目标是使用SpringJUnit4ClassRunner创建图表中的某些依赖项,并使用Mockito将其用于 Mock 其他依赖关系。但是,与此答案一样,在运行@Before方法之前,创建了测试中标记为@Autowired的任何内容。这意味着您替换上面的authService的电话只会覆盖测试中的字段;它不会调整或更改已经创建的任何其他@Autowired字段,并且已经使用了您在弹簧配置中绑定的authService

单元测试

如果这是一个单元测试,并且您只是在测试TagsServiceTagsRepository,则可能需要通过@mock和@Autowired字段的组合调用其构造函数来手动创建这些对象:

TagRepository repository = new TagRepository(/*mock*/ authService);
TagService tagService = new TagService(/*mock*/ authService, /*real*/ repository);

(Mockito提供了一种自动使用@InjectMocks创建模拟的方法,但是由于它无法检测到适当的模拟,它会默默失败,您可能需要避免使用它并致电构造函数。充分的理由和解决方案。)

请注意,以上仅在您直接与单元测试中的对象一起工作时,而不是依靠春季自动将对象更深地注入图表时。

集成测试

您发布的测试看起来像是网络或集成测试,因此看起来您想在其创建过程中用模拟替换authService的实例。通常,这意味着要更改配置XML或您的应用程序Runner,以指示Spring使用Mockito Mock而不是您的真实authservice。尽管有很多方法可以做到这一点,但您可能希望像本文一样,使用以嘲讽为中心的FactoryBean

,但是等等!您可能正在使用已定制的opplicationRunner。authService = Mockito.mock(AuthService.class);行看起来非常遥不可及,原因有三个:

  1. 您正在覆盖@Autowired字段,这很少有意义
  2. 尽管存在MockitoAnnotations.initMocks(this),但您还是手动致电Mockito.mock,这通常是首选
  3. 您立即reset模拟您创建

这向我表明,您的@Autowired authService May May 已经是一个模拟,并且May 已经有固执,这就是为什么您有剩下的reset。如果是这样,那么您的问题就不是关于Mockito的,除了您(或某人)具有覆盖的字段,并使您的本地副本固定了您的本地副本,而不是在整个网络测试中弹簧安装的副本。这很容易解决:删除您的字段重新分配,您可能会很好。

相关内容

  • 没有找到相关文章

最新更新