Spring инъекция: @MockBean @Repository не внедряется - PullRequest
0 голосов
/ 25 октября 2018

Я пытаюсь @MockBean @Repository аннотированный класс:

@Repository
public interface ApplicationDao extends MongoRepository<Application, String> {}

Я внедряю его в @Service аннотированный класс:

@Service
public class AuthorizationService {

    private ApplicationDao appsDao;
    private List<Application> allowedApplications;

    @Autowired
    public AuthorizationService(ApplicationDao appsDao) {
        this.appsDao = appsDao;   //<<MOCKED INJECTED BEAN>>
        this.fillApplications();
    }

    private void fillApplications() {
        this.appsDao.findAll()    //<<MOCKED method>>
           .forEach(entry -> {
            this.allowedApplications.put(entry.getName(), entry);
        });
    }

    public bool isAuthorized(Application application) {
        return this.allowedApplications
          .stream()
          .anyMatch(app -> app.getId().equals(application.getId()));
    }
}

МойКонфигурация тестового макета выглядит так:

@RunWith(SpringRunner.class)
@SpringBootTest()
public class GroupReferencesTest {

    private @Autowired AuthorizationService;
    private @MockBean ApplicationDao applicationDao;

    @Before
    public void setUp() {

        Application testApplication = new Application();
        testApplication.setName("test-application");
        List<Application> allowedApplications = new ArrayList<Application>();
        allowedApplications.add(testApplication);

        Mockito
            .when(this.applicationDao.findAll())
            .thenReturn(allowedApplications);
    }

    @Test
    public void test() {
        Application app = new Application();
        app.getId("test-application"); 
        assertTrue(this.authorizationService.isAuthorized(app));  //<<FAILS>>
    }
}

Тем не менее, мой макетный объект не вводится.Я имею в виду, что когда мои AuthorizationService вызовы, их введенные ApplicationDao возвращают пустой список вместо моего проверенного списка.

Я также пытался использовать @MockBean(name="applicationDao").Поведение такое же.

Я также пытался настроить свой смоделированный bean-компонент с помощью этого кода:

@TestConfiguration
public class RestTemplateTestConfiguration {

    @Bean("applicationDao")
    @Primary
    public static ApplicationDao mockApplicationDao() {
        ApplicationDao mock = Mockito.mock(ApplicationDao.class);

        Application testApplication = new Application();
        testApplication.setName("test-application");
        List<Application> allowedApplications = new ArrayList<Application>();
        allowedApplications.add(testApplication);

        Mockito
            .when(mock.findAll())
            .thenReturn(allowedApplications);

        return mock;
    }
}

Однако он работает неправильно.

Application класс:

public class Application {
    private String id;

    //setters & getters
}

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 07 сентября 2019

Рабочий пример

@RunWith(SpringRunner.class)
@SpringBootTest(classes = {AuthorizationService.class})
public class GroupReferencesTest {

    @Autowired
    private AuthorizationService;

    @MockBean
    private ApplicationDao applicationDao;

    @Test
    public void test() {
        //given
        Mockito.when(applicationDao.findAll()).thenReturn(emptyList());

        //when & then
        assertTrue(authorizationService.isAuthorized(app));
    }
}
0 голосов
/ 25 октября 2018

Перво-наперво - тип теста.Ответ: Модульный тест.

Вы запускаете контекст Spring, который управляет жизненным циклом AuthorizationService, а затем вы пытаетесь внедрить макет.Что на самом деле происходит, так это то, что контейнер Spring IoC вводит реальный ApplicationDao (тот, которым управляет контейнер Spring IoC) в AuthorizationService.

Решение:

Управляйте жизненным циклом AuthorizationService вашим тестовым бегуном (например, MockitoJUnitRunner и вставляйте ApplicationDao макет в него):

@RunWith(MockitoJUnitRunner.class)
public class GroupReferencesTest {

    private @InjectMocks AuthorizationService authorizationService;
    private @Mock ApplicationDao applicationDao;

    @Before
    public void setUp() {

        Application testApplication = new Application();
        testApplication.setName("test-application");
        List<Application> allowedApplications = new ArrayList<Application>();
        allowedApplications.add(testApplication);

        Mockito
            .when(this.applicationDao.findAll())
            .thenReturn(allowedApplications);
    }

    @Test
    public void test() {
        Application app = new Application();
        app.getId("test-application"); 
        assertTrue(this.authorizationService.isAuthorized(app));
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...