Я пытаюсь использовать Шаблон зависимости инжектора конструктора .
Интересно, каков правильный подход для внедрения репозиториев JPA в классы тестирования интеграции:
У меня есть мойисходный код:
RepoClass
@Repository
public interface MyClassRepo extends JpaRepository<MyClass, Long> {
... methods ...
}
Служба после инжекции коэнтрактора
public class MyClassService {
private final MyClassRepo myClassRepo;
public DeviceServiceImpl(final MyClassRepo myClassRepo) {
this.myClassRepo = myClassRepo;
}
public boolean myMethodToTest() {
... whatever...
}
}
Чтобы проверить это: (Здесьприходит моя проблема)
SpringRunner класс ВАРИАНТ 1: Внедрение в конструктор
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = MyTestConfigClass.class) // With necessary imports
@SpringBootTest
public class MyClassTester {
private final MyClassService myClassService;
private final MyClassRepository myClassRepository;
public MyClassTester (final MyClassRepository deviceRepository) {
this.myClassRepository = myClassRepository;
this.myClassService= new myClassService(myClassRepository);
}
}
Не работает, так как вывод консоли говорит:
Testкласс должен иметь ровно один открытый конструктор с нулевым аргументом
класс SpringRunner ВАРИАНТ 2: Автоматическая инъекция
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = MyTestConfigClass.class) // With necessary imports
@SpringBootTest
public class MyClassTester {
@Autowired
private MyClassRepository myClassRepository;
private MyClassService myClassService = new myClassService(myClassRepository);
}
Я чувствую, что он ломаетсятребуемый шаблон.
класс SpringRunner ВАРИАНТ 3: Пустой конструктор
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = MyTestConfigClass.class) // With necessary imports
@SpringBootTest
public class MyClassTester {
private final MyClassService myClassService;
private final MyClassRepository myClassRepository;
public MyClassTester () {
this.myClassRepository = new MyClassRepository(); // Obviously NOT working, since its an interface
this.myClassService= new myClassService(myClassRepository);
}
}
Как прокомментировано: Очевидно, что НЕ работает, поскольку MyClassRepository является его интерфейсом
Есть ли лучший способ решить этоподать в суд?