spring测试(最终)

考虑下图中的事务性服务层类。你使用的是 Spring 事务,它内部使用 Spring AOP 调用 update1 方法时,发生了什么事情? (选择一项)

public class ClientServiceImpl implements ClientService{
    @Transactional (propagation=Propagation.REQUIRED) 
    public void update1(){ update2(); }      
                                   
    @Transactional(propagation=Propagation.REQUIRES_NEW) 
    public void update2(){ } 
}

A.只有一个事务,因为如果已经存在一个事务,REQUIRES_NEW 将使用一个活动事务 

B.有 2 个事务,因为 REQUIRES_NEW 总是在一个新的事务中运行 

C.只有一个事务,因为对 update2()的调用是内部的(不通过代理) 

【正确答案】C

【答案解析】C:Spring 管理事务是基于接口代理的,如果是内部调用,则不重新经过代理对象,则无事务的特性,即在“内部调用” 时,被调用的方法上的@Transactional 是无效的,注解参数更加没有任何意义。

 

考虑以下来自 @Configuration 类的代码,并应用 Spring 的默认行为,选择正确答案(选择一项)

@Configuration 
public class MyConfig { 
    @Bean 
    public AccountRepository accountRepository(){ 
        return new JdbcAccountRepository(); 
    } 
    @Bean 
    public TransferService transferService(){
        TransferServiceImpl service = new TransferServiceImpl();         
        service.setAccountRepository(accountRepository()); return service; 
    } 
    @Bean public AccountService accountService(){ 
        return new AccountServiceImpl(accountRepository()); 
    } 
}

A.两个 AccountRepository bean 将被实例化,因为 accountRepository()方法将被调用两次 

B.三个 AccountRepository bean 将被实例化,因为 accountRepository()方法将被调用三次 

C.一个 AccountRepository bean 将被实例化,因为默认的作用域是 Singleton 

D.许多 AccountRepository bean 将被实例化取决于调用 accountRepository(),transferService()和 accountService()的频率 

【正确答案】C

答案解析】C:Spring IoC 的底层是基于代理模式的,即带@Bean 注解的方法是被 Spring 代理的,不会反复创建对象。

spring测试(最终)_第1张图片

 

 

默认情况下, Spring Boot 将自动在以下哪个地方查找属性文件?(选择一项)

A.与 Application 的主@Configuration 类名称相匹配的一个 properties 文件 

B.application. properties 或 application.yml,通常位于根 classpath 中 

C.config.properties 或 config.yml,通常位于根 classpath 中 

D.Spring Boot 不会自动查找任何属性文件,除非特别指示(例如使用@PropertySource) 

【正确答案】B

【答案解析】Spring Boot looks for application.properties in these locations (in this order) : "/config" sub-directory of the working directory; The working directory; "config" package in the classpath; classpath root // SpringBoot在这些地方(按顺序)寻找应用程序:“工作目录的“/config”子目录;工作目录;classpath中的“config”包;根路径

 

关于 Spring 的 JUnit 4 或 JUnit 5 集成测试支持,以下哪个说法是正确的?(选择一项)

A.为每个测试方法初始化并创建一个新的 ApplicationContext 

B.在一个应用程序中,你必须使用 JUnit 4 或 JUnit 5 进行所有的测试 

C.你可以通过@ContextConfiguration 来说明测试类将使用哪些配置类 

D.为了获取要测试的 Spring Bean 的引用,你需要在提供的 Application Context 上调用 getBean() 

【正确答案】C

【答案解析】A:方法共用一个ApplicationContext B:可以使用其他测试 D:可以使用@Autowired

 

以下哪项是对@PropertySource 注解的最佳解释?(选择一项)

A.用于方便地从某个外部属性文件中查找并返回单个属性值 

B.用于从某个外部来源向 Spring Environment 添加一组额外的 name/value 对 

C.用于指定 Spring Boot 应用程序中 application. properties 文件的位置 

D.Spring 框架中没有这样的注解 

【正确答案】B 

关于 Spring 对 JPA 的支持,以下哪个说法是正确的?(选择一项)

 (1) Spring 支持结合本地或全局事务管理 JPA PersistenceContexts                                               (2) JPA 提供者是通过设置 EntityManagerFactoryBean 上的 vendor adapter 属性来指定的         (3) 在管理本地事务时,JpaTransactionManager 使用 JPA EntityManagers 来完成这项工作

A.第(1)、(2)种说法是正确的 

B.所有的说法都是正确的 

C.这些说法都不正确 

D.第(2)、(3)种说法是正确的 

E.第(1)、(3)种说法是正确的 

【正确答案】B

关于 Spring和单元测试,以下哪个说法是正确的?(选择一项)

A.Spring提取了现有的Mock框架 

B.Spring提供了一个内部的Mock框架,所以不需要第三方的Mock框架,如 Mockito或 EasyMock 

【正确答案】B

 

考虑下面的代码示例。以下哪个说法是正确的?(选择一项)

public interface CustomerRepository extends CrudRepository {}

A.为了成功使用任何 Spring Data 实现(JPA、 MongoDB、 Gemfire 等), Customer 类上需要 JPA 注解 

B.该类的实现可以由 Spring Data JPA 自动生成 

C.实现 CustomerRepository 的类必须由开发者编码并声明为 Spring Bean 

D.CustomerRepository 应该是一个类,而不是一个接口 

【正确答案】B

 

如果传播行为是 Propagation.REQUIRED,哪个说法最能描述传播行为:(选择一项)

A.如果存在活动事务,则在嵌套事务中执行;如果没有事务,则启动一个新的事务 

B.如果已经存在事务,则在该事务中执行;如果没有事务,则在没有事务上下文的情况下执行 

C.如果已经存在事务,则在该事务中执行;如果没有事务,则启动一个新的事务 

D.如果已经存在事务,则在该事务中执行;如果没有活动事务,则抛出一个异常 

【正确答案】C

【答案解析】

 spring测试(最终)_第2张图片

考虑下面的配置示例。以下哪个说法是正确的?(选择一项)

@Configuration 
public class ApplicationConfig { 
    @Bean 
    public RewardNetwork rewardNetwork() { 
        return new RewardNetworkImpl(accountRepository()); 
    } 

    @Bean 
    public AccountRepository accountRepository() { 
        return new JdbcAccountRepository(); 
    } 
}

A.这种配置是正确的 

B.这个配置是无效的,因为第一个 bean 应该有一个 id,可以使用@Bean("rewardNetwork")来设置它 

C.这个配置是无效的,因为第二个 bean 应该有一个 id,可以使用@Bean("accountRepository")来设置它 

D.这个配置是无效的,因为两个 bean 都应该有一个用@Bean 指定的 id 

【正确答案】A

答案解析】Spring 并不要求为每个 Bean 显式的指定 id/name,即使没有显式的指定,Spring 也会自动为 Bean 设置 id/name。

 

使用下面的图片,考虑遗留类。如何从这个遗留类创建 Spring bean?(选择一项)

public class LegacySingleton { 
    private static LegacySingleton instance; 
    private LegacySingleton() { } 

    public static LegacySingleton getInstance() { 
        if(instance == null){ 
            Instance = new LegacySingleton(); 
        } return instance; 
    } 
}

A.从@Bean 方法返回一个 LegacySingleton 的实例, Spring 会自动调用 getInstance() 

B.从@Bean 方法中调用 LegacySingleton.getInstance(),并返回实例 

C.采用自动布线 

D.不可能,构造函数必须是公共的 

【正确答案】B

【答案解析】注意:本题题干中的“遗留类”指的就是代码中的 LagacySingleton 类,类名中的 Lagacy 的译义中有“遗留”的意思。 A:Spring 能自动调用的方法只有被 Spring 上下文加载的类中的@Bean 方法,以上代码中,LagacySingleton 不是被 Spring 上下文加载的类,所以不可能自动调用; C:自动布线(自动装配)是用于为属性注入值的; D:Spring 是基于反射的,无视访问权限。

 

以下哪个说法最能说明"After Returning" advice 类型?(选择一项)

A.通常用于防止任何由 advice 方法抛出的异常在调用栈中传播 

B."After Returning" advice 允许在方法返回后添加行为,即使它抛出了一个异常 

C.该 advice 对方法的调用具有完全的控制权,它甚至可以完全阻止方法的调用 

D.该 advice 只有在方法成功返回时才会被调用,如果该方法抛出异常则不会被调用 

【正确答案】D

【答案解析】A:该 Advice 并不针对异常有特殊的处理; B:该 Advice 仅当方法返回了某个值之后才会执行,如果抛出异常,必然没有返回值; C:不在方法之前执行的 Advice 显然无法阻止方法的调用.

spring测试(最终)_第3张图片

 

以下关于在 JUnit 集成测试中使用@Transactional 注解的说法中,哪项不是正确的的?(选择一项)

A.只有当 test 类或 test 方法被注解为@Commit(false)时,事务才会在测试后回滚出来 

B.默认情况下,每次测试后,事务将自动回滚 

C.用@Transactional 来注解 test 类,会使其所有的 test 方法在事务中运行 

D.用@Transactional 来注解 test 方法,会使 test 方法在事务中运行 

【正确答案】A

【答案解析】在单元测试方法上使用@Transactional 注解,会使得测试完成后自动回滚(即使无任何异常抛出),除非显式的在方法 上添加@Commit 注解。 另,@Commit 注解不可配置参数,即选项 A 中的代码片段是误

 

考虑下面的方法签名。 @PutMapping("/accounts/{id}") public void update(...) {...} 以下哪种方法是检索账户 id 的有效方法?(选择一项)

A.public void update(@PathVariable long accountId) 

B.public void update(@RequestParam("id") String accountId) 

C.public void update(@RequestParam long accountId) 

D.public void update(@PathVariable("id") String accountId) 

【正确答案】D

【答案解析】题干中的“检索”并不是数据库的检索,只是获取@PutMapping 参数里 id 的值。 如果要获取 URL 中占位符对应的参数值,需要使用@PathVariable 注解,如果设计的方法参数名称与 URL 中占位符名称 不同,则需要配置@PathVariable 注解参数。 对于 Spring 框架而言,只需要值可以填充,可以无视参数类型(Spring 会转换),例如请求中的存在某属性值为 100, 在设计方法参数时,使用 int / long / Integer / Long / String 等都是可以的。 所以,本题的方法参数可以设计为@PathVariable String id,或@PathVariable long id,或 @PathVariable("id") String xxx 等。

 

考虑下面的 Spring Security 配置

protected void configure(HttpSecurity http) throws Exception { 
    http.authorizeRequests() .mvcMatchers("/accounts/*").hasRole("USER")     
        .mvcMatchers("/accounts/editAccount.htm").hasRole("ADMIN"); 
} or 
protected void configure(HttpSecurity http) throws Exception { 
    http.authorizeRequests().antMatchers("/accounts/*").hasRole("USER")     
        .antMatchers("/accounts/editAccount.htm").hasRole("ADMIN"); 
} 

请注意,上面的代码并没有遵循一个良好的实践,即更特别的匹配器应该放在次特别的匹配器之前。然而,按原样使用这代码哪个角 色可以访问"/accounts/editAccount. htm"?(选择一项)

A.USER 或 ADMIN 

B.不需要角色 

C.USER 

D.ADMIN 

【正确答案】C

【答案解析】题目中是 2 段代码,针对本题而言,效果是完全相同的; Recommended : Use mvcMatchers, uses same matching rules as @RequestMapping, newer API, less error-prone. Examples : --- antMatchers("/admin").hasRole("ADMIN") --> Only matches /admin --- mvcMatchers("/admin").hasRole("ADMIN") --> Matches /admin, /admin/, /admin.html, /admin.xxx 当使用 antMatchers()或 mvcMatchers()设置请求认证规则时,对于 URL 是第 1 匹配规则生效,后续再次设置的规则不 生效。

对于配置 Spring Security 以拦截特定 URL,以下哪种策略是正确的?(选择一项)

A.可以通过配置指定的 URL(使用 authorizeRequests()与 antMatchers 或 mvcMatcher 方法),最特别的匹配在先,最不特别的匹配在后 

B.可以通过配置指定的 URL(使用 authorizeRequests()和 antMatchers 或 mvcMatchers 方法

你可能感兴趣的:(spring)