我在下面的测试中嘲笑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
。
单元测试
如果这是一个单元测试,并且您只是在测试TagsService
和TagsRepository
,则可能需要通过@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);
行看起来非常遥不可及,原因有三个:
- 您正在覆盖
@Autowired
字段,这很少有意义 - 尽管存在
MockitoAnnotations.initMocks(this)
,但您还是手动致电Mockito.mock
,这通常是首选 - 您立即
reset
模拟您创建
这向我表明,您的@Autowired
authService
May May 已经是一个模拟,并且May 已经有固执,这就是为什么您有剩下的reset
。如果是这样,那么您的问题就不是关于Mockito的,除了您(或某人)具有覆盖的字段,并使您的本地副本固定了您的本地副本,而不是在整个网络测试中弹簧安装的副本。这很容易解决:删除您的字段重新分配,您可能会很好。