Spring Boot Mockito将模拟注入到作用域会话Bean中

时间:2018-08-31 07:01:52

标签: java spring mockito junit4

在将模拟注入到我需要测试的一类中时遇到问题。我正在尝试模拟一个Dao类,并且在我正在使用的各种服务中使用ReflectionTestUtils这样做没有问题,但是这个只是不想工作,它一直在调用Dao类并从数据库中获取错误。 >

这是测试类:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
@WebAppConfiguration
public class DedicationControllerTest extends AbstractRestTest {

    @Mock
    UserDaoImpl userDao;

    @Autowired
    @InjectMocks
    GrantedAuthoritiesLevelsHolder grantedAuthoritiesLevelsHolder;

    @Test
    public void shouldTest() throws Exception {
        //given
        String json = this.getJsonFromFile("json/my.json");

        Mockito.when(userDao.getUser(Mockito.anyString())).thenReturn(new User(1l, "mock"));
        ReflectionTestUtils.setField(grantedAuthoritiesLevelsHolder, "userDao", userDao);

        ResultActions result = mockMvc.perform(post( controllerUrl + "/action")
            .contentType(MediaType.APPLICATION_JSON_UTF8)
            .content(json));

        // then
        result
            .andExpect(status().isOk());
    }
}

这是我要向其中注入模拟的类:

@Component
@Scope(value="session", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class GrantedAuthoritiesLevelsHolder {

    @Autowired
    private UserDao userDao;

        // some methods
}

2 个答案:

答案 0 :(得分:1)

在加载上下文时,您将必须将模拟bean注册为UserDao。您可以如下所示进行注册。将其放在带有@Configuration

注释的任何类中
@Bean
@Primary
public UserDao UserDao() {
    return mock(UserDao.class);
}

答案 1 :(得分:0)

我相信您的配置可能不足以在Spring上下文中进行模拟。

我的建议

@MockBean(answer=Answers.RETURNS_SMART_NULLS)
UserDao userDao;

@Autowired
GrantedAuthoritiesLevelsHolder grantedAuthoritiesLevelsHolder;

它应该在Spring上下文中放置一个模拟,此外,它还应该为您提供不正确/缺少存根的提示。