我首先要说的是,我刚开始使用java-ee和arquillian(一般的单元测试)。
我正在使用wildfly 8.0.0CR1。
我有一个类(我将称之为“初始化Bean”),这是一个简单的@Singleton @Startup
bean,它使用@PostConstruct
方法进行基本的db初始化。
对应的是单元测试,在@Before
方法中,截断所有数据库的表,为初始化阶段准备数据库。
问题是在我的单元测试设置之前调用Initialization Bean @PostContruct
方法,以便在Initialization Bean @PostContruct
方法之后实际调用应该截断所有数据库表的方法。 / p>
如何正确调试@PostContruct
@Singleton
bean中的@Startup
方法?
我希望我已经足够清楚,否则明天我会发布一些真实的代码。 提前致谢
答案 0 :(得分:2)
您是否使用@javax.ejb.Singleton
注释了init bean?
我遇到了同样的问题,然后我注意到我用@javax.inject.Singleton
注释了init bean。修复注释后,将调用@PostConstruct
方法。
答案 1 :(得分:0)
您可以使用反射来实例化任何@StartUp类,并在每个测试类之前调用@PostConstruct方法。显然,这很容易用Spring完成,但我们在这种环境中没有使用Spring。这是我如何做到的一个例子:
public class BaseTest {
@BeforeClass
public static void instantiateStartupClasses() throws InvocationTargetException, IllegalAccessException, InstantiationException {
Reflections reflections = new Reflections("com.company.project");
//Find all classes annotated with Startup in a given package.
Set<Class<?>> classes = reflections.getTypesAnnotatedWith(Startup.class);
for(Class clazz : classes) {
if(clazz.isInterface()) continue;
//Instantiate the object
Object instantiatedClass = clazz.newInstance();
//Find any PostConstruct methods on the class and invoke them using the instantiated object.
for(Method method : clazz.getDeclaredMethods()) {
if(method.isAnnotationPresent(PostConstruct.class)) {
//Invoke the post constructor method.
method.invoke(instantiatedClass);
}
}
}
}
}
答案 2 :(得分:-1)
有一种方法可以解决问题。您不应该使用Autowire使用@PostConstruct方法创建bean对象。您可以通过java代码创建bean。
1在测试类中制作一个这样的方法:
private BeanFactory getTestBeanFactory() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath*:<your test context>-test.xml");
return applicationContext.getAutowireCapableBeanFactory();
}
测试中的2执行此代码:
// get your bean object
YourBean yourBean = getTestBeanFactory().getBean(YourBean.class);
// call manually a post construct method of your bean
yourBean.<the post construct method of your bean>();
// do something with the yourBean
...
它工作正常
祝你好运