【问题标题】:Reduce amount of or remove @Autowired annotations In Spring Junit 5 test在 Spring Junit 5 测试中减少或删除 @Autowired 注释的数量
【发布时间】:2020-07-02 12:01:10
【问题描述】:

在 Junit 5 中是否可以在没有 @Autowired 注释的情况下将 spring bean 注入测试类?我的代码如下所示:

@SpringBootTest(classes = SomeApp.class)
@ExtendWith(SpringExtension.class)
public class SomeTest {
    @Autowired
    private SomeService someService

    @Test
    public void shouldMakeMagic() { ....

我想删除所有@Autowired 注释

【问题讨论】:

  • 你想通过删除这些来实现什么?也许你需要嘲笑?
  • 99% 的测试没有模拟或模拟被定义为 spring bean。这个注释对我来说只是样板。在 Kotlin 中的工作是这样的:class SomeTest @Autowired constructor( private val someService: SomeService ) { 我想在 java 中实现这样的东西 - 由构造函数注入而不自动装配

标签: java spring spring-boot testing junit5


【解决方案1】:

Kotlin 的优点是您可以在构造函数中声明成员字段,而这在 Java 中是无法做到的。在 Java 中,您可以创建 @Autowired 构造函数,但它不会减少样板代码,因为您仍然需要在类中声明类成员。

但是,如果您愿意使用神奇的 Java 样板代码删除器 Project Lombok,您可以实现类似的效果,请参见下面的 cmets 示例:

@SpringBootTest
@ExtendWith(SpringExtension.class)
// Below will generate you the constuctor for each final member
// and add @Autowired on it so resulting:
// @Autowired
// public SomeTest(SomeService someService, SomeOtherService someOtherService)    
// {
//    this.someService = someServive;
//    this.someOtherService = someOtherServive;
// }
@RequiredArgsConstructor(onConstructor = @__({@Autowired}))
public class SomeTest {

    private final SomeService someService;
    private final SomeOtherService someOtherService;

    @Test
    public void shouldMakeMagic() {
        assertNotNull(someService);
        assertNotNull(someOtherService);
    }
    
}

现在不同的是,Kotlin 自动从构造函数生成成员,而 Java 和 Lombok 从成员生成构造函数。

注意:这当然也适用于主代码,而不仅仅是测试。

【讨论】:

  • 使用最新的 Spring 版本,如果你的类只有一个,你也可以删除构造函数上的 @Autowired。这将把 boilerplate 减少到只是 @RequiredArgsConstructor
  • @rieckpil 感谢您的提示。我也会对此进行测试。通常在测试类中只有一个构造函数。
  • 没有 Autowired 不起作用RequiredArgsConstructor。我有:org.junit.jupiter.api.extension.ParameterResolutionException: No ParameterResolver registered for parameter
猜你喜欢
  • 1970-01-01
  • 2012-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-19
  • 1970-01-01
  • 1970-01-01
  • 2018-12-30
相关资源
最近更新 更多