我正在尝试使用Spring框架使用JUnit测试CRUD方法。下面的代码完美无缺
@Transactional
public class TestJdbcDaoImpl {
@SuppressWarnings("deprecation")
@BeforeClass
@Test
public static void setUpBeforeClass() throws Exception {
ApplicationContext ctx = new ClassPathXmlApplicationContext("spring.xml");
JdbcDaoImpl dao = ctx.getBean("jdbcDaoImpl",JdbcDaoImpl.class);
Circle cicle = new Circle();
dao.insertCircle(new Circle(6,"e"));
}}
但是,使用@RunWith(SpringJUnit4ClassRunner.class)的代码会给我一个错误
** 2014年6月11日下午1:00:15 org.springframework.test.context.TestContextManager retrieveTestExecutionListeners信息:无法实例化TestExecutionListener [org.springframework.test.context.web.ServletTestExecutionListener]。指定自定义侦听器类或使默认侦听器类(及其所需的依赖项)可用。违规类:[javax / servlet / ServletContext] **
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/spring.xml")
@Transactional
public class TestJdbcDaoImpl {
@Autowired
private static JdbcDaoImpl dao;
@SuppressWarnings("deprecation")
@BeforeClass
public static void setUpBeforeClass() throws Exception {
Circle cicle = new Circle();
dao.insertCircle(new Circle(10,"e"));
}
答案 0 :(得分:8)
您的测试中至少存在两个问题
1)您不能在测试中使用标准ServletContext。要么使用Spring配置的一部分只使用不使用ServletContext的Beans,要么使用Spring-MVC-Test支持(从Spring 3.2开始提供)
2)@BeforeClass
在加载spring上下文之前运行。因此,请改用@Before
。
尝试解决这两个问题的示例:
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration // <-- enable WebApp Test Support
@ContextConfiguration("/spring.xml")
@Transactional
public class TestJdbcDaoImpl {
@Autowired
private static JdbcDaoImpl dao;
@SuppressWarnings("deprecation")
@Before // <-- Before instead of BeforeClass
public static void setUpBeforeClass() throws Exception {
Circle cicle = new Circle();
dao.insertCircle(new Circle(10,"e"));
}
答案 1 :(得分:3)
只有在您要加载WebApplicationContext时才应使用WebAppConfiguration。如果是简单的单元测试(即不是集成测试),则不应该依赖此注释。
错误消息非常清楚:指定自定义侦听器类或使默认侦听器类(及其所需的依赖项)可用。换句话说,要么指定以下内容:
@TestExecutionListeners(listeners = { DependencyInjectionTestExecutionListener.class,
DirtiesContextTestExecutionListener.class, TransactionalTestExecutionListener.class })
在org.springframework.test.context.TestContextManager中定义:
private static final String[] DEFAULT_TEST_EXECUTION_LISTENER_CLASS_NAMES = new String[] {
"org.springframework.test.context.web.ServletTestExecutionListener",
"org.springframework.test.context.support.DependencyInjectionTestExecutionListener",
"org.springframework.test.context.support.DirtiesContextTestExecutionListener",
"org.springframework.test.context.transaction.TransactionalTestExecutionListener" };
以便不再加载ServletTestExecutionListener,或添加以下依赖项: javax.servlet-api
答案 2 :(得分:2)
我遇到了这个问题,而@TestExecutionListener建议并不适用于我。然后我更新了我的junit依赖(4.8.2-> 4.12),这解决了这个问题。