java - spring中的 self 注入(inject)并使用mockito进行测试

标签 java spring spring-boot junit mockito

我们使用的是 Spring 5.2.x(带有 Spring Boot 2.3.x)和 Mockito 3.3.x。
我需要拨打 @Transactional我的服务中的方法。因此我不得不求助于自我注入(inject)。

@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 使用构造函数注入(inject)。出于显而易见的原因,我无法声明实例变量 selffinal ,因此使用 @Autowired对于这个。该类(class)工作正常,但我发现单元测试存在问题。
我的问题有两部分 -
  • 关于我进行自我注入(inject)的方式 - 这是进行自我注入(inject)的最佳方式吗? Spring 框架的作者在 Spring 的最新版本中是否推荐了其他方法?
  • Mockito 绝不能将self bean 注入(inject)到CUT(Class Under Test)的对象中。有没有办法以干净的方式实现这一目标?

  • 我已经考虑了以下几点:
  • self 引入一个 setter并使用它在设置方法中注入(inject)自我。不想只为测试添加 setter。
  • 使用 ReflectionUtils设置 self .反射对我来说似乎是不干净的。我更喜欢 @Setter在这个。
  • 尝试使用 @RunWith(SpringJunit4Runner.class)但这按预期失败了,因为我没有创建适当的上下文和内容。
  • 最佳答案

    在 setUp() 方法中调用 ReflectionTestUtils.setField(myClass, "self", myClass)

    关于java - spring中的 self 注入(inject)并使用mockito进行测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63187187/

    相关文章:

    java - HttpUrlConnection 不起作用并显示 GET 和 POST 调用的不同状态代码

    java - Storm : Spout for reading data from a port

    java - tomcat运行但404无错误返回

    java - 在 Spring MVC 中 - model.addAttribute 动态数据的用法以及如何将数据放置在 jsp 文件中

    spring-boot - 具有原始数据类型的@Endpoint - 端点没有适配器

    java - JavaFX 中的 DataFormat 已存在错误 (IllegalArgumentException)

    Java 文档覆盖方法不 InheritDoc

    spring - 有序初始化是依赖注入(inject)泛化/框架的要求吗?

    java - Thymeleaf 3.0 Spring Boot + Security 集成不起作用

    spring-boot - Sails JS 和 Spring Boot 之间的共享 session