标签: spring-junit

spring我应该在每个类上使用@DirtiesContext

我有几个junit测试,

@ContextConfiguration(locations = { "file:../business/src/test/resources/application-context-test.xml",
        "file:src/main/webapp/WEB-INF/confA.xml", "classpath:/mvc-dispatcher-servlet-test.xml"})
@WebAppConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
public class ProductContentControllerTest {
...
}
Run Code Online (Sandbox Code Playgroud)

在类中,所有测试都必须在相同的上下文中运行(在这种情况下).

但我希望我所有的测试类都是独立的.我假设它是默认行为,但是当我一起运行所有测试时,它似乎运行得太快了.

它是如何工作的?应用程序上下文是否仅针对每个测试类启动一次?

我应该添加:@DirtiesContext(classMode = ClassMode.AFTER_CLASS)

在每个测试类?

谢谢

junit spring spring-test spring-junit

19
推荐指数
1
解决办法
2万
查看次数

Spring jUnit测试属性文件

我有一个jUnit测试,它有自己的属性文件(application-test.properties)和它的spring配置文件(application-core-test.xml).

其中一种方法使用spring config实例化的对象,它是一个spring组件.类中的一个成员从application.properties派生它的值,application.properties是我们的主要属性文件.通过jUnit访问此值时,它始终为null.我甚至尝试更改属性文件以指向实际的属性文件,但这似乎不起作用.

这是我访问属性文件对象的方式

@Component
@PropertySource("classpath:application.properties")
public abstract class A {

    @Value("${test.value}")
    public String value;

    public A(){
        SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
    }

    public A(String text) {
        this();
        // do something with text and value.. here is where I run into NPE
    }

}

public class B extends A { 
     //addtnl code

    private B() {

    }


    private B(String text) {
         super(text)
    }
}

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:META-INF/spring/application-core-test.xml",
                             "classpath:META-INF/spring/application-schedule-test.xml"})
@PropertySource("classpath:application-test.properties")
public class TestD {

    @Value("${value.works}")
    public String valueWorks;

    @Test
    public void testBlah() {     
        SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
        B b= new …
Run Code Online (Sandbox Code Playgroud)

java junit spring spring-junit

19
推荐指数
2
解决办法
10万
查看次数

使用spring bean的JUnit规则

我有一个测试类加载测试spring应用程序上下文,现在我想创建一个junit规则,它将在mongo db中设置一些测试数据.为此,我创建了一个规则类.

public class MongoRule<T> extends ExternalResource {

    private MongoOperations mongoOperations;
    private final String collectionName;
    private final String file;

    public MongoRule(MongoOperations mongoOperations, String file, String collectionName) {
        this.mongoOperations = mongoOperations;
        this.file = file;
        this.collectionName = collectionName;
    }

    @Override
    protected void before() throws Throwable {
        String entitiesStr = FileUtils.getFileAsString(file);
        List<T> entities = new ObjectMapper().readValue(entitiesStr, new TypeReference<List<T>>() {
        });
        entities.forEach((t) -> {            
            mongoOperations.save(t, collectionName);
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我在我的测试类中使用这个规则并传递mongoOperations bean.

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SpringTestConfiguration.class)
public class TransactionResourceTest {

    @Autowired
    private ITransactionResource transactionResource;

    @Autowired …
Run Code Online (Sandbox Code Playgroud)

java junit spring-junit

10
推荐指数
2
解决办法
3997
查看次数

在JUnit测试中自动装配Spring服务

我有以下Spring服务:

@Service
public class MyService  {
   public List<int> getIds(Filter filter){
      ...
   }
}
Run Code Online (Sandbox Code Playgroud)

和配置类:

@Configuration
public static class MyApplicationContext {

    @Bean
    public Filter filter(ApplicationContext context) {
        return new Filter();
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,我想创建一个单元测试来检查getIds方法是否返回正确的结果.我创建了以下JUnit测试:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=MyApplicationContext.class,                                                   
                      loader=AnnotationConfigContextLoader.class)
public class AppTest
{
    @Autowired
    Filter filter;

    @Autowired
    MyService service;
}
Run Code Online (Sandbox Code Playgroud)

编译器为Filter类找到正确的bean,但是为服务变量抛出"BeanCreationException:Could not autowire field"异常.我尝试将服务类添加到ContextConfiguration.classes,但随后编译器抛出"IllegalStateException:无法加载ApplicationContext"异常.

如何在ContextConfiguration中包含MyService?

java junit spring spring-junit

8
推荐指数
1
解决办法
1万
查看次数

Junit HSQLDB - 用户缺少未找到的权限或对象 - THIS_.oh-ordnbr

当我的列名包含连字符" - "时,我收到异常

    Entity : this is the entity name.
    @Entity
    @Table(name = "RequestHeader")
    public class RequestHeader implements Serializable { 
    ....
    ....    
    @Column(name = "`oh-ordnbr`")
    private Integer ohOrdnbr;
Run Code Online (Sandbox Code Playgroud)

架构定义:这是架构创建的查询.

    CREATE MEMORY TABLE PUB.REQUESTHEADER(
           REQUESTID INTEGER,
           IMUSERID INTEGER,
           REQUESTDATE DATE,
           REQUESTTIME INTEGER,
           REQUESTSTATUS VARCHAR(19),
           REQUESTTYPE VARCHAR(22),
           HEADERINSTRUCTIONS VARCHAR(5150),
           DATEFORMAT VARCHAR(20),
           TIMEFORMAT VARCHAR(20),
           LANGUAGEID INTEGER,
           "OH-ORDNBR" INTEGER,
           "OH-TRCNSTAMP" INTEGER,
           ISPICKUPLIST BIT(1),
           CONSTRAINT "RQH-1" PRIMARY KEY(REQUESTID)
     );
Run Code Online (Sandbox Code Playgroud)

错误如下:

Exception Stack: Error message which I have received by running the Junit.
Caused by: org.hsqldb.HsqlException: …
Run Code Online (Sandbox Code Playgroud)

hsqldb spring-junit

8
推荐指数
1
解决办法
3万
查看次数

Hibernate:java.lang.NoSuchMethodError:javax/validation/spi/ConfigurationState.getParameterNameProvider()Ljavax/validation/ParameterNameProvider

我们正在为基于Spring-Hibernate的应用程序执行Junit套件(使用spring text conext单元测试框架).使用ANT构建和在Hibernate Jars下面的构建路径.

hibernate-validator-5.0.1.Final.jar
validation-api-1.1.0.Final.jar

hibernate-commons-annotations-4.0.2.Final.jar
hibernate-core-4.2.3.Final.jar
hibernate-ehcache-4.2.3.Final.jar
hibernate-entitymanager-4.2.3.Final.jar
Run Code Online (Sandbox Code Playgroud)

我们得到的错误似乎与Hibernate验证有关.

   java.lang.NoSuchMethodError:javax/validation/spi/ConfigurationState.getParameterNameProvider()Ljavax/validation/ParameterNameProvider at org.hibernate.validator.internal.engine.ValidatorFactoryImpl.(ValidatorFactoryImpl.java:113) at org.hibernate.validator.HibernateValidator.buildValidatorFactory(HibernateValidator.java:45) at org.hibernate.validator.internal.engine.ConfigurationImpl.buildValidatorFactory(ConfigurationImpl.java:217) at javax.validation.Validation.buildDefaultValidatorFactory(Validation.java:50) at org.hibernate.cfg.beanvalidation.TypeSafeActivator.getValidatorFactory(TypeSafeActivator.java:445) at org.hibernate.cfg.beanvalidation.TypeSafeActivator.activate(TypeSafeActivator.java:96) at org.hibernate.cfg.beanvalidation.BeanValidationIntegrator.integrate(BeanValidationIntegrator.java:150)
Run Code Online (Sandbox Code Playgroud)

hibernate junit4 spring-junit

7
推荐指数
1
解决办法
1万
查看次数

没有定义名为'org.springframework.context.annotation.ConfigurationClassPostProcessor.importRegistry'的bean

我正在尝试运行完整的junit测试类包,我有一个我的域类的审计类,如下所示:

    @PrePersist
    public void prePersist(AuditableEntity e) {

      UserService userService = SpringBeanFactory.getBean(UserService.class);  
      // some auditing here  
    }
Run Code Online (Sandbox Code Playgroud)

- SpringBeanFactory类:

public class SpringBeanFactory {

    private static ApplicationContext applicationContext;

    public static <T> T getBean(final String name, final Class<T> requiredType) {
        T bean = null;
        if (applicationContext != null) {
            bean = applicationContext.getBean(name, requiredType);
        }
        return bean;
    }

    public static <T> T getBean(final Class<T> requiredType) {
        T bean = null;
        if (applicationContext != null) {
            bean = applicationContext.getBean(requiredType);
        }
        return bean;
    }

    public static …
Run Code Online (Sandbox Code Playgroud)

junit spring dependency-injection spring-test spring-junit

7
推荐指数
1
解决办法
2万
查看次数

@ExtendWith(SpringExtension.class)无效

我正在尝试在spring-boot 2.x项目中使用Junit 5来测试Controller.

以下工作正常

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import static org.springframework.test.web.servlet.setup.MockMvcBuilders.webAppContextSetup;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;

@WebMvcTest(TypesController.class)
@RunWith(SpringRunner.class)
public class TypesControllerTest {
    @Autowired
    WebApplicationContext wac;

    @Test
    public void testTypes() throws Exception {
        webAppContextSetup(wac).build().perform(get("/types").accept(MediaType.APPLICATION_JSON))
                .andExpect(status().isOk()).andExpect(content().contentType("application/json;charset=UTF-8"));
    }

    @EnableWebMvc
    @Configuration
    @ComponentScan(basePackageClasses = { TypesController.class })
    static class Config {
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我将其更改为使用SpringExtention,

..

import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.junit.jupiter.api.extension.ExtendWith;

..
@ExtendWith(SpringExtension.class)
@WebMvcTest(TypesController.class)
public class TypesControllerTest …
Run Code Online (Sandbox Code Playgroud)

spring spring-mvc-test spring-junit spring-boot junit5

7
推荐指数
1
解决办法
5712
查看次数

使用 Cucumber 运行时如何添加 RunListener 和 TestExecutionListeners

我们当前的测试框架使用junit + spring + selenium 运行。我们的测试同时使用了 junit 的org.junit.runner.notification.RunListeners 和 spring org.springframework.test.context.TestExecutionListener

这是测试定义的样子:

@RunWith(SpringJUnit4ClassRunner.class)
@TestExecutionListeners(listeners = {MyTestExecutionListener.class})
@ContextConfiguration(locations = {"classpath:/META-INF/spring/my-context.xml"})
public abstract class BaseAutomationTest extends AbstractJUnit4SpringContextTests {
}
Run Code Online (Sandbox Code Playgroud)

我的问题是在使用 Cucumber 时我应该在哪里编写驻留在侦听器中的代码

请注意,此代码需要访问 spring 的ApplicationContext.

junit cucumber-jvm cucumber-junit spring-junit

5
推荐指数
0
解决办法
835
查看次数

如何使用MockMvc的构造函数注入来测试控制器

我有一个带构造函数注入的控制器

@RestController
@RequestMapping("/user")
public class MainController {

    private final UserMapper userMapper; // autowired by constructor below

    public MainController(UserMapper userMapper) {
        this.userMapper = userMapper;
    }

    @RequestMapping("/getChannels")
    public String index() {
        LoginUser user = userMapper.getUserByName("admin");
        return "Channels: " + user.getChannels();
    }
}
Run Code Online (Sandbox Code Playgroud)

这是一个工作正常的简单类.但是,当我尝试使用下面的类运行JUnit测试时,我收到了一个错误.

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
public class MainControllerTest {

    private MockMvc mvc;
    private final UserMapper userMapper;

    public MainControllerTest(UserMapper userMapper) {
        this.userMapper = userMapper;
    }

    @Before
    public void setUp() throws Exception {
        mvc = MockMvcBuilders.standaloneSetup(new MainController(userMapper)).build();
    }

    ......
Run Code Online (Sandbox Code Playgroud)

错误是:

java.lang.Exception: Test class should …
Run Code Online (Sandbox Code Playgroud)

java spring-junit

5
推荐指数
1
解决办法
6290
查看次数