为什么@RunWith(SpringJUnit4ClassRunner.class)不起作用?

时间:2014-06-11 06:54:16

标签: spring junit

我正在尝试使用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"));
   }

3 个答案:

答案 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),这解决了这个问题。