如何在静态@BeforeClass中自动装配字段?

mem*_*und 33 java junit spring spring-test

@RunWith(SpringJUnit4ClassRunner.class)
public void ITest {
    @Autowired
    private EntityRepository dao;

    @BeforeClass
    public static void init() {
        dao.save(initialEntity); //not possible as field is not static
    }
}
Run Code Online (Sandbox Code Playgroud)

如何在静态init类中注入我的服务?

Vla*_*dtn 27

使用 Junit 5 你可以做到这一点(@BeforeAll 而不是 @BeforeClass)

public void ITest {
    @Autowired
    private EntityRepository dao;

    @BeforeAll
    public static void init(@Autowired EntityRepository dao) {
        dao.save(initialEntity); //possible now as autowired function parameter is used
    }
}
Run Code Online (Sandbox Code Playgroud)

离开该领域意味着它可以用于其他测试


小智 17

我一直使用的一个解决方法是使用@Before一个标志来跳过它为每个测试用例执行

@RunWith(SpringJUnit4ClassRunner.class)
public class BaseTest {

@Autowired
private Service1 service1;

@Autowired
private Service2 service2;

private static boolean dataLoaded = false;

@Before
public void setUp() throws Exception {

    if (!dataLoaded) {
        service1.something();
        service2.somethingElse();
        dataLoaded = true;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 我一直在这样做,但是必须有一个更好的方法,特别是当你依赖注入/自动装配的字段时,因为在这种情况下`@ BeforeClass`将不起作用. (3认同)

yer*_*lin 9

Spring 2.x 版本的 UPD。

Spring 2.x 支持SpringExtensionJunit 5 Jupiter 的新特性 a ,您所要做的就是:

  1. 声明你的测试类 @ExtendWith(SpringExtension.class)

  2. 使用 bean注入您的@BeforeAll(替代@BeforeClassJUnit 5 中的)

例如:

@ExtendWith(SpringExtension.class)
...
public void ITest {

    @BeforeAll
    public static void init(@Autowired EntityRepository dao) {
        dao.save(initialEntity);
    }

}
Run Code Online (Sandbox Code Playgroud)

假设您使用 Spring 2.x 正确配置了 JUnit 5 Jupiter

更多关于它的信息:https : //docs.spring.io/spring/docs/current/spring-framework-reference/testing.html#testcontext-junit-jupiter-extension


Nen*_*zic 8

在我看来,你试图在测试之前填充数据库.

我会尝试两种选择:

  • 如果您可以将初始脚本提取到sql文件(如果这是您的选项而不使用存储库bean),您可以使用此方法并使用此方法注释您的测试@Sql
  • 您可以浏览DbUnit,这里是spring dbunit连接器的链接,它正是这样做的,并帮助您在测试之前填充数据库.这是一个用于在spring测试框架和dbunit之间进行集成的github链接.当你做,你必须@DatabaseSetup@DatabaseTearDown将要做的事情在DB你需要

我知道这并没有回答如何在静态注入bean,@BeforeClass但是它看起来正在解决你的问题.

更新: 我最近在我的项目中遇到了同样的问题并挖出了这篇帮助我的文章,我认为这是处理这类问题的优雅方式.您可以SpringJUnit4ClassRunner使用侦听器进行扩展,该侦听器可以使用您定义的所有bean进行实例级别设置