标签: spring-test

Spring bean在单元测试环境中重新定义

我们将Spring用于我的应用程序目的,并使用Spring Testing框架进行单元测试.但是我们遇到一个小问题:应用程序代码从类路径中的位置列表(xml文件)加载Spring应用程序上下文.但是当我们运行单元测试时,我们希望一些Spring bean是模拟而不是完整的实现类.此外,对于某些单元测试,我们希望一些bean成为模拟,而对于其他单元测试,我们希望其他bean成为模拟,因为我们正在测试应用程序的不同层.

所有这些意味着我想重新定义应用程序上下文的特定bean并在需要时刷新上下文.在执行此操作时,我只想重新定义位于一个(或多个)原始xml bean定义文件中的一小部分bean.我找不到一个简单的方法来做到这一点.一直认为Spring是一个测试友好框架的单元,所以我必须在这里遗漏一些东西.

你有什么想法怎么做吗?

谢谢.

spring unit-testing spring-test

51
推荐指数
4
解决办法
5万
查看次数

在每次春季启动时都覆盖一个@Configuration类@Test

在我的春季启动应用程序中,我希望@Configuration在我的@EnableAuthorizationServer @Configuration所有测试中仅使用测试配置(特别是我的类)覆盖我的一个类.

到目前为止,在概述了弹簧启动测试功能弹簧集成测试功能之后,没有出现直接的解决方案:

  • @TestConfiguration:这是为了扩展,而不是超越;
  • @ContextConfiguration(classes=…?)@SpringApplicationConfiguration(classes =…?)让我覆盖整个配置,而不仅仅是一个类;
  • 建议@Configuration在a 内部的类@Test覆盖默认配置,但不提供示例;

有什么建议?

spring spring-test spring-boot

43
推荐指数
2
解决办法
4万
查看次数

如何在Spring中的每次测试之前重新创建数据库?

我的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.为什么?

java spring spring-mvc spring-test spring-boot

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

spring boot test无法注入TestRestTemplate和MockMvc

我正在使用弹簧靴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-mvc spring-test spring-boot

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

在Spring中配置特定的内存数据库以进行测试

如何配置我的Spring Boot应用程序,以便在运行单元测试时,它将使用内存数据库,如H2/HSQL,但是当我运行Spring Boot应用程序时,它将使用生产数据库[Postgre/MySQL]?

spring spring-test spring-data spring-test-dbunit spring-boot

38
推荐指数
6
解决办法
4万
查看次数

Mockito Exception - when()需要一个必须是模拟方法调用的参数

我有一个非常简单的测试用例,它使用的是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.请分享并指导我正确的方向.

java controller spring-test mockito

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

'application.yml'中的Spring Boot属性未从JUnit Test加载

我究竟做错了什么?我正在使用这个小的独立应用程序运行并找到我的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)

java junit spring spring-test spring-boot

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

使用spring boot禁用单元测试的安全性

我正在尝试用安全性创建一个简单的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 …

spring-test spring-boot

34
推荐指数
5
解决办法
4万
查看次数

错误:在为Spring Controller执行@WebMvcTest时无法找到@SpringBootConfiguration

我正在测试下面给出的控制器

@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配置.请指出正确的方向,这里发生了什么.以及如何解决这个问题.谢谢

java spring-mvc spring-test spring-boot

34
推荐指数
2
解决办法
5万
查看次数

如何使用Spring在单元测试中模拟远程REST API?

假设我在我的应用程序中创建了一个使用远程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有哪些替代方案?

java rest unit-testing spring-test

33
推荐指数
4
解决办法
6万
查看次数