2017-01-27 28 views
3

我对Spring很新,我使用Craig Walls的“Spring in Action”(第四版)进行学习。兴趣不仅在于如何编写正在工作的代码,还取决于使用Spring的正确原则。当使用由构造函数调用创建的Spring bean可以接受时,是否有任何用例?

关于从第142页下面的一段代码,清单5.6:

public class HomeControllerTest { 

    @Test 
    public void testHomePage() throws Exception { 
     HomeController controller = new HomeController(); 
     MockMvc mockMvc = standaloneSetup(controller).build(); 
     mockMvc.perform(get("/")).andExpect(view().name("home")); 
    } 
} 

我的问题是由以下的想法产生:

  1. 一般的理解是,Spring使用依赖注入作为减少对象依赖关系的管理开销,增加模块性,简化测试和代码重用。但是,这不意味着bean必须由容器创建和管理吗?自从我开始阅读这个主题后,我记住的第一个细节表明,new不应出现在遵循DI的一段精心编写的代码中。
  2. 如果我们想测试一个Stateful bean,这可能是一个解决方案吗?我的意思是,如果有多个独立测试在同一个实例上运行,那么每个测试都会测试相同的bean状态。尽管我发现这样做有一个合适的注释(@DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD))。
  3. 是否还有另一个难以或无法解决的使用案例(使用new除外)?

一个更多'到信'的实施将使用@ContextConfiguration来指定ApplicationContext

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = WebConfig.class) 
@WebAppConfiguration 
public class HomeControllerTest { 

    @Autowired 
    HomeController controller; 

    @Test 
    public void testHomePage() throws Exception { 
     MockMvc mockMvc = standaloneSetup(controller).build(); 
     mockMvc.perform(get("/")).andExpect(view().name("home")); 
    } 
} 
+0

*是否有另一个用例很难或无法解决否则*。这是什么意思? – CKing

+0

@CKing我的意思是:是否有任何情况下,我们没有替代品,我们必须使用显式构造函数(如bean = new Bean(...))创建bean。在书中的例子和问题#2中,我找到了替代方案,所以我想知道是否还有其他情况,新方法是解决某个问题的唯一方法。 – aUserHimself

回答

1
  1. 是的,你不应该使用新创建的Spring bean实例在生产代码(否则他们不是Spring豆了)。但是DI的重点在于让你创建并在单元测试中手动注入具有伪依赖性的对象。所以这里的测试代码非常好。

  2. 是的,每个单元测试都可以自由创建自己的bean实例并按需要的方式填充它。尽管有状态的豆类非常少见。他们通常是无国籍的。

  3. 另一个使用new来创建Spring bean的地方正好在@Bean中 - 注释了配置类的方法。这些方法的全部意义在于创建并初始化Spring bean,Spring将随后使用和注入。但是,再次使用新的单元测试是绝好的,也是正确的做法。

+0

非常感谢你澄清这一点,当我认为现在它很有意义。 – aUserHimself

相关问题