java spring单元测试失败,加载ApplicationContext失败

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/45842345/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-11-03 08:56:28  来源:igfitidea点击:

java spring unit test failure , failed to load ApplicationContext

javaspringunit-testingspring-mvcjunit

提问by Elias

I'm trying to do a unit test in my application to test a a method on service layer.

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

I have the following classes.

我有以下课程。

AbstractTest.java

抽象测试.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());


}

and

UserServiceTest.java that extends AbstractTest

扩展 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());
    }

}

Noting that in Abstract.java class

注意到在 Abstract.java 类中

@SpringApplicationConfiguration(classes = Application.class)

was replaced by

被替换了

@SpringBootTest(classes=UserController.class)

So when i run a unit test i get the following errors:

因此,当我运行单元测试时,出现以下错误:

Stack trace:

堆栈跟踪:

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.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

Any help concerning this?

有任何帮助吗?

回答by techtabu

The classesfield in the @SpringBootTestis the place you tell your application where your main Application Configuration is. It is not the place you specify your test classes. It should be like this,

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

@SpringBootTest(classes=Application.class)

Besides, I think you are using old version of Spring boot. I think in 1.4/ 1.5 they moved Test class to,

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

@Runwith(SpringRunner.class)

回答by Elias

thanks everyone for your help , after reading all your comments and doing some research i've figured out the solution , with adding the following annotation:

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

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

that contain the confiuration.

包含配置。