Самостоятельная инъекция весной и тестирование с помощью MockitoJAVA

Программисты JAVA общаются здесь
Гость
Самостоятельная инъекция весной и тестирование с помощью Mockito

Сообщение Гость »


Мы используем Spring 5.2.x (с Spring Boot 2.3.x) и Mockito 3.3.x.
Мне нужно вызвать

Код: Выделить всё

@Transactional
в моем сервисе изнутри. Поэтому мне пришлось прибегнуть к самостоятельной инъекции.

Код: Выделить всё

@Service
@RequiredArgsCostructor // lombok
public class MyClass {
private final dep1;
private final dep2;

@Autowired
private MyClass self;

public void someMethod() {
self.someTransactionalMethod();
// do something
}

@Transactional
public void someTransactionalMethod() {
// do something
}
}

public class MyClassTest {
@Mock
private dep1;

@Mock
private dep2;

@InjectMocks
private MyClass myClass;

@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
}

@Test
public void someMethodTest() {
// NPE when calling self.someTransactionalMethod()
}
}
Из кода следует, что мы используем внедрение конструктора с помощью lombok. По понятным причинам я не могу объявить переменную экземпляра

Код: Выделить всё

self какfinal
, следовательно, используя

Код: Выделить всё

@Autowired
для этого. Класс работает нормально, но я вижу проблемы с модульным тестом.
Мой вопрос состоит из двух частей:
  • Что касается того, как я делаю инъекцию самостоятельно, это лучший способ делать инъекцию самому себе? Есть ли какой-либо другой подход, рекомендованный авторами среды Spring в последних версиях Spring?
  • Mockito ни в коем случае не может внедрить собственный компонент в объект CUT (тестируемый класс) . Есть ли способ добиться этого чистым способом?
Я уже рассмотрел следующее:
  • < br />
  • Представьте сеттер для и используйте его для внедрения себя в метод установки. Не хочу добавлять установщик только для тестов.
  • Используйте

    Код: Выделить всё

    ReflectionUtils
    для установки

    Код: Выделить всё

    self. Отражение кажется мне нечистым. я бы предпочел@Setter
    по этому поводу.
  • Попробовал использовать

    Код: Выделить всё

    @RunWith(SpringJunit4Runner.class)
    but that failed as expected because I am not creating a proper context and stuff.


Источник: https://stackoverflow.com/questions/631 ... ng-mockito

Вернуться в «JAVA»