Используйте реальный компонент в тесте сервиса - PullRequest
0 голосов
/ 27 марта 2019

Я тестирую сервис, в котором есть вспомогательный компонент с автопроводкой.Этот компонент имеет автоматическое репо.

В моем тесте я хочу использовать вспомогательный компонент, а не макет.И я хочу смоделировать репо для этого.

Но я не могу заставить его работать.

Служба, которую я тестирую:

@Service
public class ServiceImpl{
    @Autowired
    private Helper helper;
}

Помощниккласс с автоматическим репо

@Component
public class Helper {
    @Autowired
    private Repository repo;
}

Мой тест должен быть таким

@ExtendWith(MockitoExtension.class)
public class ServiceImplTest {

    ServiceImpl service;

    @Mock
    private Repository repoMock;

    @InjectMocks
    private Helper helper;

}

Я бы хотел лучше провести рефакторинг, но, к сожалению, это невозможно ...

Любая помощь приветствуется.

Ответы [ 4 ]

2 голосов
/ 28 марта 2019

Я наконец нашел решение, спасибо за помощь.

@ExtendWith(MockitoExtension.class)
public class ServiceImplTest {

    @InjectMocks
    ServiceImpl service

    @Spy
    @InjectMocks
    private Helper helper;

    @Mock
    private Repository repoMock;

    @InjectMocks
    private Helper helper;
}

Таким образом, смоделированный репо вводится в помощника шпиона, и помощник может быть введен в службу. Объекты @Spy на самом деле создаются, поэтому, если вы не заглушите ни один из его методов, вы получите «настоящий» объект.

Здесь смоделированный репо вводится в помощник, а помощник вводится в службу.

2 голосов
/ 27 марта 2019

Я бы предпочел инжекцию в конструктор, а не в полевую.(подробнее здесь )

В этом случае ваши классы будут выглядеть примерно так:

    @Component
    public class Helper {
        @Autowired
        public Helper(Repository repo) {
            this.repo = repo;
        }
    }

    @Service
    public class ServiceImpl{
        @Autowired
        public ServiceImpl(Helper helper) {
            this.helper = helper;
        }
    }

Таким образом, вы можете легко создать настоящий Helper объект смакет Repository объект:

    ServiceImpl service;

    private Helper helper;

    @Mock
    private Repository repoMock;

    @BeforeEach
    void init() {
        helper = new Helper(repoMock);
        service = new ServiceImpl(helper);
    }
0 голосов
/ 27 марта 2019

Попробуйте загрузить конфигурацию для ваших тестов, которая отдает приоритет фиктивному репо Протестировано :

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

    @Configuration
    static class ContextConfiguration {     

        @Bean
        public Helper helper() {
            return new Helper();
        }
        @Bean
        @Primary
        public Repository repoMock() {
            Repo repo = Mockito.mock(Repository.class);
            Mockito.when(/* Mock your repo */);
            return repo;
        }
    }

    @Autowired
    private Helper helper;

    @Test
    public void testMethod() {
        // Your test goes here
    }
}

В любом случае, имейте в виду, что автоматическая разводка полей является злом .Переключиться на внедрение зависимости от конструктора как можно скорее.

См. Также:

0 голосов
/ 27 марта 2019

Если Repository является интерфейсом (а не конкретным классом), вы можете попробовать следующее:

@ExtendWith(MockitoExtension.class)
public class ServiceImplTest {

    @Spy
    @InjectMocks
    ServiceImpl service = new ServiceImpl();

    @Mock
    private Repository repoMock;

    @InjectMocks
    private Helper helper;
}
...