Интеграционные тесты на Springboot с шаблоном инжекции конструктора - PullRequest
0 голосов
/ 22 ноября 2018

Я пытаюсь использовать Шаблон зависимости инжектора конструктора .

Интересно, каков правильный подход для внедрения репозиториев 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 является его интерфейсом

Есть ли лучший способ решить этоподать в суд?

1 Ответ

0 голосов
/ 22 ноября 2018

Используйте Junit 5. Он позволяет конструкторам с несколькими аргументами.

Для варианта 1 необходимо добавить @Autowired в конструктор теста

...