java 常用测试框架

1. 常用单元化测试框架 junit4 , TestNG

可以通过注解 @Before @After @BeforeClass @AfterClass 分别作方法与类级的初始化与结束动作。 
testNG示例:

<code class="hljs cs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> TestngAnnotation {
  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// test case 1</span>
  @Test
  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">testCase1</span>() {
      System.<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">out</span>.println(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"in test case 1"</span>);
  }
  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// test case 2</span>
  @Test
  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">testCase2</span>() {
      System.<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">out</span>.println(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"in test case 2"</span>);
  }
  @BeforeMethod
  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">beforeMethod</span>() {
      System.<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">out</span>.println(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"in beforeMethod"</span>);
  }
  @AfterMethod
  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">afterMethod</span>() {
      System.<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">out</span>.println(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"in afterMethod"</span>);
  }
  @BeforeClass
  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">beforeClass</span>() {
      System.<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">out</span>.println(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"in beforeClass"</span>);
  }
  @AfterClass
  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">afterClass</span>() {
      System.<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">out</span>.println(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"in afterClass"</span>);
  }
  @BeforeTest
  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">beforeTest</span>() {
      System.<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">out</span>.println(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"in beforeTest"</span>);
  }
  @AfterTest
  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">afterTest</span>() {
      System.<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">out</span>.println(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"in afterTest"</span>);
  }
  @BeforeSuite
  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">beforeSuite</span>() {
      System.<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">out</span>.println(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"in beforeSuite"</span>);
  }
  @AfterSuite
  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">afterSuite</span>() {
      System.<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">out</span>.println(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"in afterSuite"</span>);
  }
}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li></ul>

其执行顺序为

<code class="hljs bash has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">in</span> beforeSuite
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">in</span> beforeTest
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">in</span> beforeClass
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">in</span> beforeMethod
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">in</span> test <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">in</span> afterMethod
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">in</span> beforeMethod
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">in</span> test <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">in</span> afterMethod
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">in</span> afterClass
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">in</span> afterTest
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">in</span> afterSuite</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li></ul>

对于测试类较多时,可以指定需测试的类 使用打包测试

<code class="hljs d has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@RunWith</span>(Suite.<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span>) <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//指定suit测试运行器</span>
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@Suite</span>.SuiteClasses({Junit4TimeoutTest.<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span>,Junit4ExceptionTest.<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span>})
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> Junit4SuiteTest {
}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li></ul>

如此对 Junit4TimeoutTest 与 Junit4ExceptionTest 进行打包测试,无需一个个分别测试。

2. mockito 模拟对象,并做交互验证

mock 可以mock接口和实现类 
verify 验证过程是否被调用

<code class="hljs fsharp has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background: transparent;">Sample mockedSample = mock(Sample.<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span>);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//可以是接口或者是实现类</span>
<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//验证交互</span>
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">when</span>(mockedSample.getName()).thenReturn(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"sample"</span>);
verify(mockSampleService, atMost(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)).getName(); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 验证方法之多调用了1次</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li></ul>
3. Unitils

可以通过模块化的配置,集成 spring, db (MYSQL , HIBERIATE) 以及 各种第三方测试框架(junit 4, testNG)

4. 测试web层

spring mock中 为一些依赖于容器的接口提供了模拟类,可以使用户在不启动容器的情况下 执行单元测试。 
org.springframework.mock.jndi 为jndi spi提供模拟类,摆脱对java ee容器的依赖 
org.springframework.mock.web 为servlet api接口提供模拟类(HttpServletRequest, ServletContext),脱离servlet容器测试

5. 客户端请求模拟

spring RestTemplate 
RestTemplate 是用来在客户端访问web服务的类。

<code class="hljs avrasm has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background: transparent;">    @Before
    public void init() {
        driver = new HtmlUnitDriver()<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">; //IE</span>
    }
    @Test
    public void loginCheck(){
        //完全装载页面后将控制返回给测试脚本
        driver<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.get</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"http://localhost/index.html"</span>)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">; </span>
        //element = driver<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.findElement</span>(By<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.xpath</span>( <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"//input[@id=’xxx’]"</span> ))<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
        WebElement userName = driver<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.findElement</span>(By<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.name</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"userName"</span>))<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;  </span>
        WebElement password = driver<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.findElement</span>(By<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.name</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"password"</span>))<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
        //任何页面元素都可以调用sendKeys,
        userName<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.sendKeys</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"tom"</span>)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;     </span>
        password<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.sendKeys</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"1234"</span>)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;  </span>
        //提交表单
        driver<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.findElement</span>(By<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.id</span>( <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"loginBtn"</span> ))<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.click</span>()<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
        //driver<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.findElement</span>(By<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.id</span>( <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"submit"</span> ))<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.submit</span>()<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">; 要求element必须在表单中,否则抛出NoSuchElementException</span>
        //验证返回的主页面 main<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.jsp</span>
        assertThat(driver<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.getTitle</span>(), equalTo(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"this's title"</span>))<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
        assertThat(driver<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.getPageSource</span>(), containsString(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"tom"</span>))<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
        WebElement body  = driver<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.findElement</span>(By<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.xpath</span>( <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"//body"</span> ))<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
        assertThat(body<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.getText</span>(), containsString(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"tom,welcome"</span>))<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
    }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li></ul>

上述示例引子spring3.x 企业应用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值