我在spring-boot中创建了一个Web应用程序。我正在使用testNG为我的业务层编写单元测试。
我创建了Application类
@SpringBootApplication
public class TestApplication
{
public static void main(String[] args)
{
SpringApplication.run(TestApplication.class, args);
}
@Bean
Mapper mapper()
{
List<String> mappingFiles = new ArrayList<String>();
mappingFiles.add("dozer-mappings.xml");
return new DozerBeanMapper(mappingFiles);
}
}
我的测试类看起来像
@ContextConfiguration(classes = { TestApplication.class })
public class CommissionRuleServiceTest extends AbstractTestNGSpringContextTests
{
@InjectMocks
@Autowired
MyService
@Mock
MyDAO;
@BeforeMethod
public void initMock()
{
MockitoAnnotations.initMocks(this);
}
@Test(dataProvider = "....")
......
......
}
当我运行项目时,它会显示休息登录控制台,只需几次小测试就需要20.00秒。日志中的一些陈述是,
DEBUG oscisPathMatchingResourcePatternResolver - 搜索目录DEBUG oscaConfigurationClassPostProcessor DEBUG oscaClassPathBeanDefinitionScanner DEBUG oscisPathMatchingResourcePatternResolver DEBUG osbfsDefaultListableBeanFactory DEBUG oacbconverters.ArrayConverter DEBUG org.dozer.loader.xml.XMLParser DEBUG org.hibernate.cfg.SettingsFactory DEBUG ohcfg.annotations.CollectionBinder DEBUG哦cfg.annotations.TableBinder DEBUG ohpwspi.MetamodelGraphWalker - 访问属性路径:MyEntity DEBUG osbfsDefaultListableBeanFactory DEBUG org.hibernate.SQL
为什么要这么“休”时间?我该怎么办?
调查:
@SpringBootApplication
注释等效于以下带有默认属性的注释:
@Configuration
- 表示该类包含一个或多个@Bean
方法。和@ComponentScan
一起玩。@EnableAutoConfiguration
- 将尝试猜测并配置您可能需要的bean。根据您的应用程序,这可能会导致性能下降。@ComponentScan
- 配置组件扫描。由于未定义包,因此将使用此批注从类的包中进行扫描。如果没有更多的代码,就无法给出准确的猜测,但我认为大部分性能损失都是由Spring Boot初始化引起的。
默认情况下,Spring Boot中的日志记录级别设置为INFO,可能你改变了吗?将其添加到application.properties或您需要的任何其他级别(TRACE,DEBUG,INFO,WARN,ERROR,FATAL,OFF)
logging.level.root = WARN
如前所述,自动配置可能会影响性能。您可以使用排除某些不需要的配置。这是一个例子(随机集 - 不要盲目追随)
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class,
DataSourceTransactionManagerAutoConfiguration.class, HibernateJpaAutoConfiguration.class,
ErrorMvcAutoConfiguration.class, SecurityAutoConfiguration.class, SessionAutoConfiguration.class,
ValidationAutoConfiguration.class, ThymeleafAutoConfiguration.class, WebSocketAutoConfiguration.class,
DispatcherServletAutoConfiguration.class, EmbeddedServletContainerAutoConfiguration.class,
JmxAutoConfiguration.class, MultipartAutoConfiguration.class, WebMvcAutoConfiguration.class,
JacksonAutoConfiguration.class, SpringApplicationAdminJmxAutoConfiguration.class,
MessageSourceAutoConfiguration.class, SendGridAutoConfiguration.class, FreeMarkerAutoConfiguration.class,
GroovyTemplateAutoConfiguration.class, DeviceDelegatingViewResolverAutoConfiguration.class,
SitePreferenceAutoConfiguration.class, MustacheAutoConfiguration.class,
PersistenceExceptionTranslationAutoConfiguration.class})
对于测试类我建议使用
@SpringBootTest(classes = TestApplication.class)
如果您在测试中不需要它,也可以排除Tomcat
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
并尝试给我们更多细节