我有几个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测试,它有自己的属性文件(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) 我有一个测试类加载测试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) 我有以下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?
当我的列名包含连字符" - "时,我收到异常
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) 我们正在为基于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) 我正在尝试运行完整的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) 我正在尝试在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) 我们当前的测试框架使用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.
我有一个带构造函数注入的控制器
@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) spring-junit ×10
junit ×6
spring ×5
java ×4
spring-test ×2
cucumber-jvm ×1
hibernate ×1
hsqldb ×1
junit4 ×1
junit5 ×1
spring-boot ×1