Мы используем 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()
}
}
Код: Выделить всё
self какfinalКод: Выделить всё
@AutowiredМой вопрос состоит из двух частей:
- Что касается того, как я делаю инъекцию самостоятельно, это лучший способ делать инъекцию самому себе? Есть ли какой-либо другой подход, рекомендованный авторами среды Spring в последних версиях Spring?
- Mockito ни в коем случае не может внедрить собственный компонент в объект CUT (тестируемый класс) . Есть ли способ добиться этого чистым способом?
- < br />
- Представьте сеттер дляи используйте его для внедрения себя в метод установки. Не хочу добавлять установщик только для тестов.
Код: Выделить всё
self - Используйтедля установки
Код: Выделить всё
ReflectionUtilsпо этому поводу.Код: Выделить всё
self. Отражение кажется мне нечистым. я бы предпочел@Setter - Попробовал использоватьbut that failed as expected because I am not creating a proper context and stuff.
Код: Выделить всё
@RunWith(SpringJunit4Runner.class)
Источник: https://stackoverflow.com/questions/631 ... ng-mockito