如何在@BeforeClass测试方法调用的静态方法中使用bean

时间:2017-11-06 12:13:27

标签: java spring junit static java-8

假设我有一个从类A扩展的测试类B。此类A有一个带@BeforeClass注释的方法:

@BeforeClass
public static void setUp(){
    createFakeData();
}

方法createFakeData()在类B中,其功能是在数据库中创建对象。

为了做到这一点,我在班级B中有一个bean:

@Autowired
private DummyObjectsFactory dummyObjectsFactory;

方法createFakeData()的内容可能类似于返回FakeData对象的内容:

public FakeData createFakeData() throws Exception
{
    return dummyObjectsFactory.createFakeData();
}

我面临的问题是@BeforeClass方法必须是静态的,这意味着createFakeData方法也必须是静态的。但我无法将该方法设置为静态,因为我的bean dummyObjectsFactory将始终为null

如何使我的createFakeData方法静态避免我的dummyObjectsFactory bean不为空?

2 个答案:

答案 0 :(得分:0)

据我所知,JUnit中不允许这样做。但是你可以做一些事情来安排它。

首先,您可以使用 TestNG ,这样可以完全按照您的意愿进行操作。

如果这不是一个选项,您可以使用@BefloreClass而不是@Before注释。两者之间的区别在于@BeforeClass在所有测试之前执行方法,而@Before在每次测试之前执行方法。如果您使用@Before,我会使用@Transactional注释该类,以便删除保存在数据库中的数据。

最后,如果您不想为每个测试执行该方法,可以使用@Before并平展通话:

@Before
public void init(){
    if(!fakeDataCalled){
        createFakeData();
        fakeDataCalled=true;
    }
}

答案 1 :(得分:0)

我相信你想用@RunWith(SpringRunner.class)注释你的测试类(B),以便正确地进行自动装配。

查看Spring Reference中的第15.4.4节。 您也可以浏览该页面并搜索“RunWith”

注意事项:

  1. 我不喜欢静态方法。他们倾向于使单元测试变得困难。
  2. 我不喜欢扩展测试以进行其他测试。我发现更容易使每个测试独立并使用组合用于任何共享功能(即为驻留在测试源树中的共享测试功能制作实用程序类)。
  3. 我不喜欢我的单元测试,具体取决于自动装配。我模拟所有依赖项并使用反射或@InjectMocks注释注入它们。