При слежке за JPARepository вызов метода save возвращает нуль - PullRequest
0 голосов
/ 06 февраля 2019

Я пишу интеграционный тест 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, он возвращает пустой объект вместо сущности.

Есть ли способ обойти эту проблему?

1 Ответ

0 голосов
/ 06 февраля 2019

Вместо приведенной выше конструкции просто используйте встроенную аннотацию Spring Boot @SpyBean Вам также необходимо автоматически подключить класс тестирования, который в данном случае MyService.

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
class MyServiceTest {
    @SpyBean
    MyRepository myRepository;

    @Autowired
    OtherService otherService

    public void testMyMethod() {
        myService.myMethod();
    }
}
...