java 如何在@Autowired字段中使用@Before/@BeforeClass

whlutmcx  于 2023-05-12  发布在  Java
关注(0)|答案(3)|浏览(167)

我有一个测试用例,它有一个@Autowired字段。我希望有一个方法来设置测试用例,因为它有许多@Test注解的方法,这些方法将依赖于相同的生成数据(为此我需要autowired类)。
有什么好方法可以实现这一点?
如果我有@BeforeClass,那么我需要使方法静态化,这会破坏自动装配。

piv4azn7

piv4azn71#

第1份溶液

使用TestNG代替。
@Before*注解在TestNG中表现为this way
@Before*注解的方法不一定是静态的。

@org.testng.annotations.BeforeClass
public void setUpOnce() {
   //I'm not static!
}

第二个解决方案

如果你不想这样做,你可以使用Spring的执行监听器(AbstractTestExecutionListener)。
你必须像这样注解你的测试类:

@TestExecutionListeners({CustomTestExecutionListener.class})
public class Test {
    //Some methods with @Test annotation.
}

然后用这个方法实现CustomTestExecutionListener

public void beforeTestClass(TestContext testContext) throws Exception {
    //Your before goes here.
}

包含在一个文件中,看起来像:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"commonContext.xml" })
@TestExecutionListeners({SimpleTest.class})
public class SimpleTest extends AbstractTestExecutionListener {

    @Override
    public void beforeTestClass(TestContext testContext) {
        System.out.println("In beforeTestClass.");
    }

    @Test
    public void test() {
        System.out.println("In test.");
    }
}
qni6mghb

qni6mghb2#

我提出了创建一个单独的初始化方法(不是setUp)的解决方案,并使用@PostConstruct进行注解。这并不是一个优雅的解决方案,但它确保了在使用它们之前Spring正确地初始化了autowired/injected字段(这是静态@BeforeClass注解方法的初始问题)。

huwehgph

huwehgph3#

使用Junit 5,您可以在静态@BeforeAll上下文中使用@Autowired注解,如下所示:

public class TestClass {

    @Autowired
    private ApplicationContext context;

    @BeforeAll
    public static void beforeAll(@Autowired ApplicationContext context) {
        context.doSomething() //possible now as autowired function parameter is used
    }
}

相关问题