Я пишу интеграционный тест SpringBoot, в котором мне нужно иметь возможность имитировать взаимодействия с внешними сервисами, в то же время используя некоторые реальные объекты (например, интерфейсы, расширяющие JPARepository) для взаимодействия с моей базой данных.
Допустим, мой тестируемый класс выглядит следующим образом:
@Service
class MyService {
@Autowired
MyRepository myRepository; // This is the JPARepository which I want to use the real thing
@Autowired
OtherService otherService; // This one I really want to mock
public class myMethod() {
//Code which composes anEntity
//anEntity is not null
MyEntity myEntity = myRepository.save(anEntity); //after save myEntity is null
myEntity.getId(); // this will throw an NPE
}
}
Теперь вот мой тестовый класс,
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
class MyServiceTest {
@InjectMocks
MyService service;
@Spy
@Autowired
MyRepository myRepository;
@Mock
OtherService otherService
public void testMyMethod() {
myService.myMethod();
}
}
В принципе, инъекции макетов и шпионов, кажется, идут хорошо, но дляпо какой-то причине, когда я вызываю save в MyRepository, он возвращает пустой объект вместо сущности.
Есть ли способ обойти эту проблему?