Mockito用于测试时进行打桩处理;通过它可以指定某个类的某个方法在什么情况下返回什么样的值。

例如:测试 controller时,依赖 service,这个时候就可以假设当调用 service 某个方法时返回指定的某些值,从而来降低引用类所带来的测试复杂度增加的影响。Mockito就用于这种场景。

Mockito常用测试场景描述如下:

  • 指定打桩对象的返回值
  • 判断某个打桩对象的某个方法被调用及调用的次数
  • 指定打桩对象抛出某个特定异常

Mockito的使用,一般有以下几种组合:

  • do/when:包括doThrow(…).when(…)/doReturn(…).when(…)/doAnswer(…).when(…)
  • given/will:包括given(…).willReturn(…)/given(…).willAnswer(…)
  • when/then: 包括when(…).thenReturn(…)/when(…).thenAnswer(…)

指定打桩对象返回值

通过Mockito指定打桩对象的返回值时,可以通过以下方式进行:

given

given用于对指定方法进行返回值的定制,它需要与will开头的方法一起使用,will开头的方式根据其接收参数的不同,又分成两类:一是接收直接值的,如直接指定返回结果为某个常量;二是接收Answer参数的,可以骑过Answer类的answer方法来根据传入参数定制返回结果。

Answer对象

我们实际针对的一般是某个类的某个方法;这个方法可能会有输入参数;考虑这种场景:如果要假设打桩的这个方法,在某个输入时返回值A;在另外一个输入时返回值为B;这种场景就可以通过Answer类来实现。

given + willAnswer/will

案例 根据传入的参数,返回不同的数据

  1. @RunWith(SpringRunner.class)
  2. @SpringBootTest
  3. public class LearnController2Test {
  4. @Autowired
  5. private WebApplicationContext wac;
  6. private MockMvc mvc;
  7. private MockHttpSession session;
  8. /**
  9. * 1. 对于不需要返回的任何值的类的所有方法,可以直接使用MockBean
  10. * 2. @MockBean 会代理已有的bean的方法,不会执行真实 bean 的具体方法。
  11. */
  12. @MockBean
  13. private LearnService learnService;
  14. @Before
  15. public void setupMockMvc() {
  16. //初始化MockMvc对象
  17. mvc = MockMvcBuilders.webAppContextSetup(wac).build();
  18. //构建session
  19. session = new MockHttpSession();
  20. User user = new User("root", "root");
  21. //拦截器那边会判断用户是否登录,所以这里注入一个用户
  22. session.setAttribute("user", user);
  23. }
  24. /**
  25. * 获取教程测试用例
  26. * <p>
  27. * get 请求
  28. * <p>
  29. * controller 依赖 service 的方法,这里给 service 方法打桩,不执行真实的方法
  30. *
  31. * @throws Exception
  32. */
  33. @Test
  34. public void qryLearn() throws Exception {
  35. LearnResource learnResource = new LearnResource();
  36. learnResource.setUrl("http://www.baidu.com");
  37. learnResource.setTitle("zhang");
  38. learnResource.setAuthor("zhang");
  39. learnResource.setId(10L);
  40. // 当调用 selectByKey 函数时,返回指定的值
  41. given(this.learnService.selectByKey(Mockito.any())).willAnswer(new Answer<Object>() {
  42. /**
  43. * InvocationOnMock 通过它可以获取打桩方法的实际传入参数清单
  44. * @param invocationOnMock
  45. * @return
  46. * @throws Throwable
  47. */
  48. @Override
  49. public Object answer(InvocationOnMock invocationOnMock) throws Throwable {
  50. Long argumentAt = invocationOnMock.getArgumentAt(0, Long.class);
  51. System.out.println("调用方法的实际参数: " + argumentAt);
  52. if (argumentAt.equals(Long.parseLong("1001"))) {
  53. return learnResource;
  54. }
  55. return null;
  56. }
  57. });
  58. mvc.perform(MockMvcRequestBuilders.get("/learn/resource/1001")
  59. .contentType(MediaType.APPLICATION_JSON_UTF8)
  60. .accept(MediaType.APPLICATION_JSON_UTF8)
  61. .session(session)
  62. )
  63. .andExpect(MockMvcResultMatchers.status().isOk())
  64. //jsonPath用来获取author字段比对是否为嘟嘟MD独立博客,不是就测试不通过
  65. .andExpect(MockMvcResultMatchers.jsonPath("$.author").value("嘟嘟MD独立博客"))
  66. .andExpect(MockMvcResultMatchers.jsonPath("$.title").value("Spring Boot干货系列"))
  67. .andDo(MockMvcResultHandlers.print());
  68. }
  69. }

given + willReturn

通过willReturn可以直接指定打桩的方法的返回值

案例 在任何场景下,都返回指定的数据

  1. /**
  2. * 获取教程测试用例
  3. * <p>
  4. * get 请求
  5. * <p>
  6. * controller 依赖 service 的方法,这里给 service 方法打桩,不执行真实的方法
  7. *
  8. * @throws Exception
  9. */
  10. @Test
  11. public void qryLearn() throws Exception {
  12. LearnResource learnResource = new LearnResource();
  13. learnResource.setUrl("http://www.baidu.com");
  14. learnResource.setTitle("zhang");
  15. learnResource.setAuthor("zhang");
  16. learnResource.setId(10L);
  17. given(this.learnService.selectByKey(Mockito.any())).willReturn(learnResource);
  18. mvc.perform(MockMvcRequestBuilders.get("/learn/resource/1001")
  19. .contentType(MediaType.APPLICATION_JSON_UTF8)
  20. .accept(MediaType.APPLICATION_JSON_UTF8)
  21. .session(session)
  22. )
  23. .andExpect(MockMvcResultMatchers.status().isOk())
  24. //jsonPath用来获取author字段比对是否为嘟嘟MD独立博客,不是就测试不通过
  25. .andExpect(MockMvcResultMatchers.jsonPath("$.author").value("嘟嘟MD独立博客"))
  26. .andExpect(MockMvcResultMatchers.jsonPath("$.title").value("Spring Boot干货系列"))
  27. .andDo(MockMvcResultHandlers.print());
  28. }
  29. 异常信息:
  30. java.lang.AssertionError: JSON path "$.author"
  31. Expected :嘟嘟MD独立博客
  32. Actual :zhang
  33. <Click to see difference>

when + thenReturn

thenReturn与willReturn类似

  1. /**
  2. * 获取教程测试用例
  3. * <p>
  4. * get 请求
  5. * <p>
  6. * controller 依赖 service 的方法,这里给 service 方法打桩,不执行真实的方法
  7. *
  8. * @throws Exception
  9. */
  10. @Test
  11. public void qryLearn() throws Exception {
  12. LearnResource learnResource = new LearnResource();
  13. learnResource.setUrl("http://www.baidu.com");
  14. learnResource.setTitle("zhang");
  15. learnResource.setAuthor("zhang");
  16. learnResource.setId(10L);
  17. when(this.learnService.selectByKey(Mockito.any())).thenReturn(learnResource);
  18. mvc.perform(MockMvcRequestBuilders.get("/learn/resource/1001")
  19. .contentType(MediaType.APPLICATION_JSON_UTF8)
  20. .accept(MediaType.APPLICATION_JSON_UTF8)
  21. .session(session)
  22. )
  23. .andExpect(MockMvcResultMatchers.status().isOk())
  24. //jsonPath用来获取author字段比对是否为嘟嘟MD独立博客,不是就测试不通过
  25. .andExpect(MockMvcResultMatchers.jsonPath("$.author").value("嘟嘟MD独立博客"))
  26. .andExpect(MockMvcResultMatchers.jsonPath("$.title").value("Spring Boot干货系列"))
  27. .andDo(MockMvcResultHandlers.print());
  28. }

when + thenAnswer/then

thenAnswer与willAnswer也类似

  1. /**
  2. * 获取教程测试用例
  3. * <p>
  4. * get 请求
  5. * <p>
  6. * controller 依赖 service 的方法,这里给 service 方法打桩,不执行真实的方法
  7. *
  8. * @throws Exception
  9. */
  10. @Test
  11. public void qryLearn() throws Exception {
  12. LearnResource learnResource = new LearnResource();
  13. learnResource.setUrl("http://www.baidu.com");
  14. learnResource.setTitle("zhang");
  15. learnResource.setAuthor("zhang");
  16. learnResource.setId(10L);
  17. when(this.learnService.selectByKey(Mockito.any())).thenAnswer(new Answer<Object>() {
  18. @Override
  19. public Object answer(InvocationOnMock invocationOnMock) throws Throwable {
  20. Long argumentAt = invocationOnMock.getArgumentAt(0, Long.class);
  21. System.out.println("调用方法的实际参数: " + argumentAt);
  22. if (argumentAt.equals(Long.parseLong("1001"))) {
  23. return learnResource;
  24. } else if (argumentAt.equals(Long.parseLong("1002"))) {
  25. learnResource.setAuthor("keke");
  26. return learnResource;
  27. }
  28. return null;
  29. }
  30. });
  31. mvc.perform(MockMvcRequestBuilders.get("/learn/resource/1002")
  32. .contentType(MediaType.APPLICATION_JSON_UTF8)
  33. .accept(MediaType.APPLICATION_JSON_UTF8)
  34. .session(session)
  35. )
  36. .andExpect(MockMvcResultMatchers.status().isOk())
  37. //jsonPath用来获取author字段比对是否为嘟嘟MD独立博客,不是就测试不通过
  38. .andExpect(MockMvcResultMatchers.jsonPath("$.author").value("嘟嘟MD独立博客"))
  39. .andExpect(MockMvcResultMatchers.jsonPath("$.title").value("Spring Boot干货系列"))
  40. .andDo(MockMvcResultHandlers.print());
  41. }
  42. 异常:
  43. 参数为 1001
  44. java.lang.AssertionError: JSON path "$.author"
  45. Expected :嘟嘟MD独立博客
  46. Actual :zhang
  47. <Click to see difference>
  48. 参数为 1002
  49. java.lang.AssertionError: JSON path "$.author"
  50. Expected :嘟嘟MD独立博客
  51. Actual :keke
  52. <Click to see difference>

doAnswer/doReturn + when

  1. // mock 对象不能是 @MockBean 生成的,@MockBean请况下不能用
  2. @Test
  3. public void testAnswer1() {
  4. List<String> mock = Mockito.mock(List.class);
  5. Mockito.doAnswer(new Answer() {
  6. @Override
  7. public Object answer(InvocationOnMock invocationOnMock) throws Throwable {
  8. Object[] args = invocationOnMock.getArguments();
  9. System.out.println(args[0]);
  10. Integer num = (Integer) args[0];
  11. if (num > 3) {
  12. return "大于三";
  13. } else {
  14. return "小于三";
  15. }
  16. }
  17. }).when(mock).get(Mockito.anyInt());
  18. // 当 索引为 4 时,期望 大于三
  19. Assert.assertThat(mock.get(4), equalTo("大于三"));
  20. // 当 索引为 2 时,期望 小于三
  21. Assert.assertThat(mock.get(4), equalTo("小于三"));
  22. }
  23. // mock 对象不能是 @MockBean 生成的,@MockBean请况下不能用
  24. @Test
  25. public void testAnswer1() {
  26. List<String> mock = Mockito.mock(List.class);
  27. Mockito.doReturn("大于三").when(mock).get(Mockito.anyInt());
  28. // 当 索引为 2 时
  29. Assert.assertThat(mock.get(2), equalTo("大于三"));
  30. }

判断某个打桩对象的某个方法被调用及调用的次数

  1. @Test
  2. public void qryLearn() throws Exception {
  3. LearnResource learnResource = new LearnResource();
  4. learnResource.setUrl("http://www.baidu.com");
  5. learnResource.setTitle("zhang");
  6. learnResource.setAuthor("zhang");
  7. learnResource.setId(10L);
  8. given(this.learnService.selectByKey(Mockito.any())).willReturn(learnResource);
  9. mvc.perform(MockMvcRequestBuilders.get("/learn/resource/1001")
  10. .contentType(MediaType.APPLICATION_JSON_UTF8)
  11. .accept(MediaType.APPLICATION_JSON_UTF8)
  12. .session(session)
  13. )
  14. .andExpect(MockMvcResultMatchers.status().isOk())
  15. .andDo(MockMvcResultHandlers.print());
  16. // 判断 learnService.selectByKey 方法 是否调用了
  17. Mockito.verify(learnService).selectByKey(1001L);
  18. // 判断 learnService.selectByKey 方法,期望调用 2 次,能过 times 函数指定 selectByKey 函数期望调用几次
  19. // 也可以通过 Mockito.atLeast 最少几次,Mockito.atMost 是多几次 等函数判断
  20. Mockito.verify(learnService, Mockito.times(2)).selectByKey(1001L);
  21. }
  22. 异常:因为 learnService.selectByKey 方法,调用了1次,而期望调用两次,所以测试出错
  23. org.mockito.exceptions.verification.TooLittleActualInvocations:
  24. learnServiceImpl bean.selectByKey(1001);
  25. Wanted 2 times:
  26. -> at com.dudu.outher.LearnController7Test.qryLearn(LearnController7Test.java:86)
  27. But was 1 time:
  28. -> at com.dudu.controller.LearnController.qryLearn(LearnController.java:88)

指定打桩对象抛出某个特定异常

given+willThrow

  1. @Test
  2. public void qryLearn() throws Exception {
  3. LearnResource learnResource = new LearnResource();
  4. learnResource.setUrl("http://www.baidu.com");
  5. learnResource.setTitle("zhang");
  6. learnResource.setAuthor("zhang");
  7. learnResource.setId(10L);
  8. // 调用 learnService.selectByKey 方法时,抛出异常
  9. given(this.learnService.selectByKey(Mockito.any())).willThrow(new Exception("查询出错"));
  10. mvc.perform(MockMvcRequestBuilders.get("/learn/resource/1001")
  11. .contentType(MediaType.APPLICATION_JSON_UTF8)
  12. .accept(MediaType.APPLICATION_JSON_UTF8)
  13. .session(session)
  14. )
  15. .andExpect(MockMvcResultMatchers.status().isOk())
  16. .andDo(MockMvcResultHandlers.print());
  17. }
  18. 异常:
  19. org.mockito.exceptions.base.MockitoException:
  20. Checked exception is invalid for this method!
  21. Invalid: java.lang.Exception: 查询出错

when+thenThrow

  1. @Test
  2. public void qryLearn() throws Exception {
  3. LearnResource learnResource = new LearnResource();
  4. learnResource.setUrl("http://www.baidu.com");
  5. learnResource.setTitle("zhang");
  6. learnResource.setAuthor("zhang");
  7. learnResource.setId(10L);
  8. when(this.learnService.selectByKey(Mockito.any())).thenThrow(new Exception("查询出错"));
  9. mvc.perform(MockMvcRequestBuilders.get("/learn/resource/1001")
  10. .contentType(MediaType.APPLICATION_JSON_UTF8)
  11. .accept(MediaType.APPLICATION_JSON_UTF8)
  12. .session(session)
  13. )
  14. .andExpect(MockMvcResultMatchers.status().isOk())
  15. //jsonPath用来获取author字段比对是否为嘟嘟MD独立博客,不是就测试不通过
  16. .andExpect(MockMvcResultMatchers.jsonPath("$.author").value("嘟嘟MD独立博客"))
  17. .andExpect(MockMvcResultMatchers.jsonPath("$.title").value("Spring Boot干货系列"))
  18. .andDo(MockMvcResultHandlers.print());
  19. }
  20. 异常:
  21. org.mockito.exceptions.base.MockitoException:
  22. Checked exception is invalid for this method!
  23. Invalid: java.lang.Exception: 查询出错

doThrow+when

不能用于 @MockBean 场景下

  1. @Test
  2. public void testAnswer1() {
  3. List<String> mock = Mockito.mock(List.class);
  4. // 调用 mock.size 时,抛出期望的异常信息
  5. Mockito.doThrow(new Exception("查询出错")).when(mock).size();
  6. // 调用 mock 对象的方法
  7. mock.size();
  8. }
  9. 异常:
  10. org.mockito.exceptions.base.MockitoException:
  11. Checked exception is invalid for this method!
  12. Invalid: java.lang.Exception: 查询出错

参考

doThrow:在模拟对象中调用方法时想要抛出异常时使用.

doReturn:在执行方法时要返回返回值时使用.

doAnswer:需要对传递给方法的参数执行一些操作

doNothing:是最简单的列表,基本上它告诉Mockito在调用模拟对象中的方法时什么也不做.有时用于void返回方法或没有副作用的方法,或者与您正在进行的单元测试无关

https://blog.csdn.net/icarusliu/article/details/78860351

静态方法测试

Mockito无法对静态方法进行Mock,如果需要Mock静态方法,需要使用到PowerMockito

  1. <dependency>
  2. <groupId>org.powermock</groupId>
  3. <artifactId>powermock-api-mockito</artifactId>
  4. <version>1.7.1</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.powermock</groupId>
  8. <artifactId>powermock-module-junit4</artifactId>
  9. <version>1.7.1</version>
  10. </dependency>

单元测试时,需要使用PowerMockRunner及PrepareForTest两个注解

  1. @RunWith(PowerMockRunner.class)
  2. // 对 StringUtils 静态方法进行测试
  3. @PrepareForTest({StringUtils.class})
  4. public class TestStatic {
  5. @Test
  6. public void testStaticMethod() {
  7. // 对 StringUtils 打桩
  8. PowerMockito.mockStatic(StringUtils.class);
  9. PowerMockito.when(StringUtils.isNoneBlank(Mockito.anyString())).thenReturn(false);
  10. boolean bbb = StringUtils.isNoneBlank("bbb");
  11. System.out.println(bbb);
  12. }
  13. }

与SpringBootTest一起使用

SpringBootTest必须要使用SpringRunner才能生效;但RunWith没有办法指定多个,可以通过PowerMockRunnerDelegate来解决这个问题:

  1. @RunWith(PowerMockRunner.class)//使用powermock提供的代理来使用
  2. @PowerMockRunnerDelegate(SpringRunner.class)
  3. @PowerMockIgnore({"javax.management.*", "javax.net.ssl.*"})//忽略一些powermock使用的classloader无法处理的类
  4. @PrepareForTest({StringUtils.class})// @PrepareForTest 可以 mock 多个静态方法
  5. @SpringBootTest
  6. public class LearnController11Test {
  7. @Autowired
  8. private WebApplicationContext wac;
  9. private MockMvc mvc;
  10. private MockHttpSession session;
  11. @MockBean
  12. private LearnService learnService;
  13. @Before
  14. public void setupMockMvc() {
  15. //初始化MockMvc对象
  16. mvc = MockMvcBuilders.webAppContextSetup(wac).build();
  17. //构建session
  18. session = new MockHttpSession();
  19. User user = new User("root", "root");
  20. //拦截器那边会判断用户是否登录,所以这里注入一个用户
  21. session.setAttribute("user", user);
  22. }
  23. /**
  24. * 获取教程测试用例
  25. * <p>
  26. * get 请求
  27. * <p>
  28. * controller 依赖 service 的方法,这里给 service 方法打桩,不执行真实的方法
  29. *
  30. * @throws Exception
  31. */
  32. @Test
  33. public void qryLearn() throws Exception {
  34. LearnResource learnResource = new LearnResource();
  35. learnResource.setUrl("http://www.baidu.com");
  36. learnResource.setTitle("Spring Boot干货系列");
  37. learnResource.setAuthor("嘟嘟MD独立博客");
  38. learnResource.setId(10L);
  39. // 对 service层中的方法进行 mock
  40. given(this.learnService.selectByKey(Mockito.any())).willReturn(learnResource);
  41. // 对 StringUtils 打桩,mock 静态方法
  42. PowerMockito.mockStatic(StringUtils.class);
  43. // 当 执行 StringUtils.isNoneBlank 方法时,返回 false
  44. PowerMockito.when(StringUtils.isNoneBlank(Mockito.anyString())).thenReturn(false);
  45. // 实际使用中 StringUtils.isNoneBlank("bbb") 返回 true,但这里返回 false
  46. boolean result = StringUtils.isNoneBlank("bbb");
  47. System.out.println("StringUtils.isNoneBlank: " + result);
  48. mvc.perform(MockMvcRequestBuilders.get("/learn/resource/1001")
  49. .contentType(MediaType.APPLICATION_JSON_UTF8)
  50. .accept(MediaType.APPLICATION_JSON_UTF8)
  51. .session(session)
  52. )
  53. .andExpect(MockMvcResultMatchers.status().isOk())
  54. //jsonPath用来获取author字段比对是否为嘟嘟MD独立博客,不是就测试不通过
  55. .andExpect(MockMvcResultMatchers.jsonPath("$.author").value("嘟嘟MD独立博客"))
  56. .andExpect(MockMvcResultMatchers.jsonPath("$.title").value("Spring Boot干货系列"))
  57. .andDo(MockMvcResultHandlers.print());
  58. }
  59. }

spring-boog-测试打桩-Mockito的更多相关文章

  1. Spring MVC测试框架

    原文链接:http://jinnianshilongnian.iteye.com/blog/2004660 Spring MVC测试框架详解——服务端测试 博客分类: springmvc杂谈 spri ...

  2. Spring MVC测试框架详解——服务端测试

    随着RESTful Web Service的流行,测试对外的Service是否满足期望也变的必要的.从Spring 3.2开始Spring了Spring Web测试框架,如果版本低于3.2,请使用sp ...

  3. Spring TestContext测试框架搭建

    同样是测试,JUnit和Spring TestContext相比,Spring TestContext优势如下: 1.Spring TestContext可以手动设置测试事务回滚,不破坏数据现场 2. ...

  4. Spring引用测试

    上下文 using System; using Spring.Core; using Spring.Aop; using System; using Spring.Core; using Spring ...

  5. 用IntelliJ IDEA 开发Spring+SpringMVC+Mybatis框架 分步搭建三:配置spring并测试

    这一部分的主要目的是 配置spring-service.xml  也就是配置spring  并测试service层 是否配置成功 用IntelliJ IDEA 开发Spring+SpringMVC+M ...

  6. Spring Boot(七):spring boot测试介绍

    首先maven要引入spring-boot-starter-test这个包. 先看一段代码 @RunWith(SpringRunner.class) @SpringBootTest(webEnviro ...

  7. spring 学习(一):使用 intellijIDEA 创建 maven 工程进行 Spring ioc 测试

    spring学习(一):使用 intellijIDEA 创建 maven 工程进行 Spring ioc 测试 ioc 概念 控制反转(Inversion of Control,缩写为IOC),是面向 ...

  8. Spring Boot 测试时的日志级别

    1.概览 该教程中,我将向你展示:如何在测试时设置spring boot 日志级别.虽然我们可以在测试通过时忽略日志,但是如果需要诊断失败的测试,选择正确的日志级别是非常重要的. 2.日志级别的重要性 ...

  9. spring + junit 测试

    spring + junit 测试 需要一个工具类 package com.meizu.fastdfsweb; import org.junit.runner.RunWith; import org. ...

  10. Spring Boot中采用Mockito来mock所测试的类的依赖(避免加载spring bean,避免启动服务器)

    最近试用了一下Mockito,感觉真的挺方便的.举几个应用实例: 1,需要测试的service中注入的有一个dao,而我并不需要去测试这个dao的逻辑,只需要对service进行测试.这个时候怎么办呢 ...

随机推荐

  1. jmeter发送json数据,报405、400错误解决方案

    1.405错误解决方案:添加HTTP信息头管理器(错误因数:发送格式未设置) 2.400错误解决方案:json文本格式有误(注意:换行.空格等)解决方案:对照json文本数据(错误因数:发送的json ...

  2. 查看MySQL最近执行的语句

    首先登入MySQL. Reading table information for completion of table and column names You can turn off this ...

  3. Vue设置页面的title

    原文地址:http://www.cnblogs.com/JimmyBright/p/7410771.html 前端框架如Vue.React等都是单页面的应用,也就是说整个web站点其实都是一个inde ...

  4. MacBook设置终端颜色,补全忽略大小写,设置命令别名alias,设置vim,设置显示git分支

    1.启用终端颜色 修改配置文件 $ vim .bash_profile #enables colorin the terminal bash shell export export CLICOLOR= ...

  5. 编译安装haproxy开启支持SSL

    1.下载程序包 # wget http://www.haproxy.org/download/1.7/src/haproxy-1.7.5.tar.gz # tar xvf haproxy-1.7.5. ...

  6. springboot项目添加jsp支持

    一.创建springboot项目 使用 http://start.spring.io/ 快速创建一个springboot项目下载并导入 二.添加依赖 在pom.xml中添加支持jsp的依赖如下: &l ...

  7. 实现运行在独立线程池的调度功能,基于Spring和Annotation

    使用Spring的注解(@Scheduled)声明多个调度的时候,由于其默认实现机制,将导致多个调度方法之间相互干扰(简单理解就是调度不按配置的时间点执行). 为了解决该问题尝试了修改线程池大小,但是 ...

  8. [转]Asp.Net MVC使用HtmlHelper渲染,并传递FormCollection参数的陷阱

    http://www.cnblogs.com/errorif/archive/2012/02/13/2349902.html 在Asp.Net MVC 1.0编程中,我们经常遇见这样的场景,在新建一个 ...

  9. 团体程序设计天梯赛 L1-011. A-B

    读入的是字符串,数组大小至少为字符串长度+1 #include <stdio.h> #include <stdlib.h> #include <string.h> ...

  10. C#线程篇---线程池如何管理线程(6完结篇)

    C#线程基础在前几篇博文中都介绍了,现在最后来挖掘一下线程池的管理机制,也算为这个线程基础做个完结. 我们现在都知道了,线程池线程分为工作者线程和I/O线程,他们是怎么管理的? 对于Microsoft ...