我们将Spring用于我的应用程序目的,并使用Spring Testing框架进行单元测试.但是我们遇到一个小问题:应用程序代码从类路径中的位置列表(xml文件)加载Spring应用程序上下文.但是当我们运行单元测试时,我们希望一些Spring bean是模拟而不是完整的实现类.此外,对于某些单元测试,我们希望一些bean成为模拟,而对于其他单元测试,我们希望其他bean成为模拟,因为我们正在测试应用程序的不同层.
所有这些意味着我想重新定义应用程序上下文的特定bean并在需要时刷新上下文.在执行此操作时,我只想重新定义位于一个(或多个)原始xml bean定义文件中的一小部分bean.我找不到一个简单的方法来做到这一点.一直认为Spring是一个测试友好框架的单元,所以我必须在这里遗漏一些东西.
你有什么想法怎么做吗?
谢谢.
在我的春季启动应用程序中,我希望@Configuration在我的@EnableAuthorizationServer @Configuration所有测试中仅使用测试配置(特别是我的类)覆盖我的一个类.
到目前为止,在概述了弹簧启动测试功能和弹簧集成测试功能之后,没有出现直接的解决方案:
@TestConfiguration:这是为了扩展,而不是超越;@ContextConfiguration(classes=…?)并@SpringApplicationConfiguration(classes =…?)让我覆盖整个配置,而不仅仅是一个类;@Configuration在a 内部的类@Test覆盖默认配置,但不提供示例;有什么建议?
我的Spring-Boot-Mvc-Web应用程序在application.properties文件中具有以下数据库配置:
spring.datasource.url=jdbc:h2:tcp://localhost/~/pdk
spring.datasource.username=sa
spring.datasource.password=
spring.datasource.driver-class-name=org.h2.Driver
Run Code Online (Sandbox Code Playgroud)
这是我做的唯一配置.我没有任何其他配置.尽管如此,Spring和子系统会在每次运行Web应用程序时自动重新创建数据库.数据库在系统运行时重新创建,而在应用程序结束后包含数据.
我不理解这个默认值,并期望这适合测试.
但是当我开始运行测试时,我发现数据库只重建了一次.由于测试是在没有预定义的顺序执行的,所以这是毫无意义的.
所以,问题是:如何理解?即如何在应用程序首次启动时在每次测试之前重新创建数据库?
我的测试类标题如下:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = myapp.class)
//@WebAppConfiguration
@WebIntegrationTest
@DirtiesContext
public class WebControllersTest {
Run Code Online (Sandbox Code Playgroud)
如你所见,我@DirtiesContext在课堂上尝试过并没有帮助.
UPDATE
我有一个豆子
@Service
public class DatabaseService implements InitializingBean {
Run Code Online (Sandbox Code Playgroud)
哪个有方法
@Override
@Transactional()
public void afterPropertiesSet() throws Exception {
log.info("Bootstrapping data...");
User user = createRootUser();
if(populateDemo) {
populateDemos();
}
log.info("...Bootstrapping completed");
}
Run Code Online (Sandbox Code Playgroud)
现在我做populateDemos()了清除数据库中所有数据的方法.不幸的是,它在每次测试之前都没有调用过@DirtiesContext.为什么?
我正在使用弹簧靴1.4.0.RELEASE.我正在为我的控制器类编写测试.我得到以下异常.
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'com.concur.cognos.authentication.service.ServiceControllerITTest': Unsatisfied dependency expressed through field 'restTemplate': No qualifying bean of type [org.springframework.boot.test.web.client.TestRestTemplate] found for dependency [org.springframework.boot.test.web.client.TestRestTemplate]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.boot.test.web.client.TestRestTemplate] found for dependency [org.springframework.boot.test.web.client.TestRestTemplate]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
Run Code Online (Sandbox Code Playgroud)
这是我的测试课
public class ServiceControllerITTest extends ApplicationTests {
@Autowired …Run Code Online (Sandbox Code Playgroud) 如何配置我的Spring Boot应用程序,以便在运行单元测试时,它将使用内存数据库,如H2/HSQL,但是当我运行Spring Boot应用程序时,它将使用生产数据库[Postgre/MySQL]?
spring spring-test spring-data spring-test-dbunit spring-boot
我有一个非常简单的测试用例,它使用的是Mockito和Spring Test框架.当我做
when(pcUserService.read("1")).thenReturn(pcUser);
Run Code Online (Sandbox Code Playgroud)
我得到了这个例外.
org.mockito.exceptions.misusing.MissingMethodInvocationException:
when() requires an argument which has to be 'a method call on a mock'.
For example:
when(mock.getArticles()).thenReturn(articles);
Also, this error might show up because:
1. you stub either of: final/private/equals()/hashCode() methods.
Those methods *cannot* be stubbed/verified.
2. inside when() you don't call method on mock but on some other object.
at com.project.cleaner.controller.test.PcUserControllerTest.shouldGetPcUser(PcUserControllerTest.java:93)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
Run Code Online (Sandbox Code Playgroud)
我尝试过不同的方法,但继续收到此错误消息.我正在使用Spring 3.1.0.RELEASE和Mockito.请分享并指导我正确的方向.
我究竟做错了什么?我正在使用这个小的独立应用程序运行并找到我的src/main/resources/config/application.yml.相同的配置在JUnit中不起作用,见下文:
@Configuration
@ComponentScan
@EnableConfigurationProperties
public class TestApplication {
public static void main(String[] args) {
SpringApplication.run(TestApplication.class);
}
}
@Component
@ConfigurationProperties
public class Bean{
...
}
Run Code Online (Sandbox Code Playgroud)
以下不起作用,application.yml未加载相同的属性并且Bean只有null值:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = TestApplication.class)
public class SomeTestClass {
...
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试用安全性创建一个简单的spring boot web项目.我可以正常启动应用程序,安全性正常.但是,我有一些我想要测试的组件没有安全性(或者根本没有测试 - 我根本无法进行测试).
我得到一个异常,表明它找不到ObjectPostProcessor,因此无法启动容器.
引起:org.springframework.beans.factory.NoSuchBeanDefinitionException:找不到类型为[org.springframework.security.config.annotation.ObjectPostProcessor]的限定bean用于依赖
14:01:50.937 [main] ERROR o.s.boot.SpringApplication - Application startup failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'fmpdfApplication.ApplicationSecurity': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire method: public void org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter.setObjectPostProcessor(org.springframework.security.config.annotation.ObjectPostProcessor); nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.security.config.annotation.ObjectPostProcessor] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1210) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE]
at … 我正在测试下面给出的控制器
@Controller
public class MasterController {
@GetMapping("/")
public String goLoginPage(){
return "index";
}
}
Run Code Online (Sandbox Code Playgroud)
我下面这个春天文件来测试我的控制器.现在,我想通过实例化Web层而不是文档中给出的整个Spring上下文来测试我的控制器.下面是我的相同代码.
@RunWith(SpringRunner.class)
@WebMvcTest
public class MasterControllerTestWithWebLayer {
@Autowired
MockMvc mockMvc;
@Autowired
MasterController masterController;
@Before
public void setUp() throws Exception {
}
@After
public void tearDown() throws Exception {
}
@Test
public void testLoginHome() throws Exception{
mockMvc.perform(get("/"))
.andExpect(status().isOk())
.andExpect(view().name("index"));
}
}
Run Code Online (Sandbox Code Playgroud)
当我运行此测试时,我收到错误Unable to find @SpringBootConfiguration,...etc.但我很困惑为什么当我们不希望它实例化它但只想使用Web层时它要求Spring配置.请指出正确的方向,这里发生了什么.以及如何解决这个问题.谢谢
假设我在我的应用程序中创建了一个使用远程Web服务的简单客户端,该服务在某个URI上公开RESTful API /foo/bar/{baz}.现在我想对我的客户端进行单元测试,该客户端调用此Web服务.
理想情况下,在我的测试中,我想模拟我从Web服务获得的响应,给出一个特定的请求,如/foo/bar/123或/foo/bar/42.我的客户端假设API实际上正在某个地方运行,所以我需要一个本地"Web服务"来开始运行http://localhost:9090/foo/bar我的测试.
我希望我的单元测试是自包含的,类似于使用Spring MVC Test框架测试Spring控制器.
一些简单客户端的伪代码,从远程API获取数字:
// Initialization logic involving setting up mocking of remote API at
// http://localhost:9090/foo/bar
@Autowired
NumberClient numberClient // calls the API at http://localhost:9090/foo/bar
@Test
public void getNumber42() {
onRequest(mockAPI.get("/foo/bar/42")).thenRespond("{ \"number\" : 42 }");
assertEquals(42, numberClient.getNumber(42));
}
// ..
Run Code Online (Sandbox Code Playgroud)
使用Spring有哪些替代方案?
spring-test ×10
spring-boot ×7
java ×5
spring ×5
spring-mvc ×3
unit-testing ×2
controller ×1
junit ×1
mockito ×1
rest ×1
spring-data ×1