Spring Boot, Mockito, вводит макет в сессионный компонент - PullRequest
0 голосов
/ 31 августа 2018

У меня проблема с введением макета в один класс, который мне нужен для тестирования. Я пытаюсь смоделировать класс 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 голосов
/ 31 августа 2018

Я полагаю, что вашей конфигурации может быть недостаточно для насмешки в контексте Spring.

Мой совет:

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

@Autowired
GrantedAuthoritiesLevelsHolder grantedAuthoritiesLevelsHolder;

Это должно поместить насмешку в контекст Spring, более того, это должно дать вам подсказки с неправильной / отсутствующей заглушкой.

0 голосов
/ 31 августа 2018

Вам нужно зарегистрировать макет bean как UserDao, когда контекст загружается. Вы можете зарегистрировать его, как показано ниже. Поместите это в любой класс, помеченный @Configuration

@Bean
@Primary
public UserDao UserDao() {
    return mock(UserDao.class);
}
...