【问题标题】:java spring unit test failure , failed to load ApplicationContextjava spring单元测试失败,无法加载ApplicationContext
【发布时间】:2017-08-23 14:19:07
【问题描述】:

我正在尝试在我的应用程序中进行单元测试以测试服务层上的方法。

我有以下课程。

AbstractTest.java

import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.equadis.webapp.controller.UserController;

//inform spring which class to use when executing unit test
@RunWith(SpringJUnit4ClassRunner.class)

@SpringBootTest(classes=UserController.class)
public abstract class AbstractTest {
    protected Logger logger = LoggerFactory.getLogger(this.getClass());


}

扩展 AbstractTest 的 UserServiceTest.java

import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import com.equadis.webapp.DAO.UserDAO;
import com.equadis.webapp.entity.UserVO;
import com.equadis.webapp.test.AbstractTest;



@Transactional
public class UserServiceTest extends AbstractTest {

    @Autowired
    private UserService service;


    @Before
    public void setup(){
        service = new UserService();
    }

    @After
    public void tearDown(){
        //clean up after each test method
    }


    @Test
    public void getListByID() {
        UserVO user = service.getListByID(1);
        System.out.println(user);
        Assert.assertNotNull("failure - expected not null", user);
        Assert.assertEquals("failure - expected id", 1, user.getId());
    }

}

注意在 Abstract.java 类中

@SpringApplicationConfiguration(classes = Application.class)

被替换为

@SpringBootTest(classes=UserController.class)

所以当我运行单元测试时,我得到以下错误:

堆栈跟踪:

java.lang.IllegalStateException: Failed to load ApplicationContext
    at org.springframework.test.context.TestContext.getApplicationContext(TestContext.java:201)
    at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:109)
    at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:75)
    at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:255)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:111)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.invokeTestMethod(SpringJUnit4ClassRunner.java:148)
    at org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java:51)
    at org.junit.internal.runners.JUnit4ClassRunner$1.run(JUnit4ClassRunner.java:44)
    at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:27)
    at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:37)
    at org.junit.internal.runners.JUnit4ClassRunner.run(JUnit4ClassRunner.java:42)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:97)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Caused by: java.lang.IllegalArgumentException: Can not build an ApplicationContext with a NULL 'contextLoader'. Consider annotating your test class with @ContextConfiguration.
    at org.springframework.util.Assert.notNull(Assert.java:115)
    at org.springframework.test.context.TestContext.loadApplicationContext(TestContext.java:169)
    at org.springframework.test.context.TestContext.getApplicationContext(TestContext.java:197)
    ... 17 more

对此有任何帮助吗?

【问题讨论】:

标签: java spring unit-testing spring-mvc junit


【解决方案1】:

@SpringBootTest 中的classes 字段是您告诉应用程序您的主要应用程序配置在哪里的地方。它不是您指定测试类的地方。应该是这样的,

@SpringBootTest(classes=Application.class)

此外,我认为您使用的是旧版本的 Spring boot。我认为在 1.4/ 1.5 中,他们将 Test 类移至,

@Runwith(SpringRunner.class)

【讨论】:

  • 感谢您的回复,我实际上没有主要的应用程序配置类,我正在使用包含配置的 xml 文件,知道如何引用它们吗? @techtabu
  • 如果你有一个 Spring boot 应用程序,你应该有一个 Application.class,不是吗?
【解决方案2】:

感谢大家的帮助,在阅读了您所有的 cmets 并进行了一些研究后,我找到了解决方案,并添加了以下注释:

@ContextConfiguration(locations={"/myxmlfile.xml"})

包含配置。

【讨论】:

    猜你喜欢
    • 2017-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-28
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    • 2015-04-19
    相关资源
    最近更新 更多