Java 弹簧自注入及mockito测试

Java 弹簧自注入及mockito测试,java,spring,spring-boot,junit,mockito,Java,Spring,Spring Boot,Junit,Mockito,我们使用的是Spring5.2.x(带SpringBoot2.3.x)和Mockito3.3.x 我需要从服务中调用@Transactional方法。因此,我不得不求助于自我注射 @Service @RequiredArgsCostructor // lombok public class MyClass { private final dep1; private final dep2; @Autowired private MyClass self;

我们使用的是Spring5.2.x(带SpringBoot2.3.x)和Mockito3.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决不能将self bean注入到CUT(测试中的类)的对象中。有没有办法以干净的方式实现这一点
  • 我已经考虑过以下几点:

  • self
    引入一个setter,并使用它在setup方法中注入self。不希望仅为测试添加setter
  • 使用
    ReflectionUtils
    设置
    self
    。我觉得倒影是不干净的。比起这个,我更喜欢
    @Setter
  • 尝试使用
    @RunWith(SpringJunit4Runner.class)
    ,但正如预期的那样失败了,因为我没有创建正确的上下文和内容

  • 在setUp()方法中调用ReflectionTestUtils.setField(myClass,“self”,myClass)

    这可能是将服务和someTransactionalMethod()重构为不同类以便可以模拟的好例子吗?
    someTransactionalMethod
    在该服务中定义良好。只是为了测试,不要认为重构是个好主意。我已经提到过,这不是我想继续使用的方法。