Unit Test in VS2017

本文介绍了如何使用Mock和Shim技术来补充单元测试,并详细解释了GenerateStub与GenerateMock的区别及应用场景。此外还介绍了Visual Studio 2017中的实时单元测试功能,以及如何部署测试文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一:Mock

对现有的代码补UT,因为存在大量的引用,reference这些引用,并Fakes它的DLL。

  • 如果引用是接口采用MockRepository.GenerateStub<T>实例化
  • 如果引用是类实例,可以实例化"ShimXXXX"

构造的时候如果有真正类的实例更好,非常实用!。例如对class A生成对应的Shim类:

new ShimA(new A())

另外一些方法:

调用构造函数创建一个类:
 

var ctor = typeof(ClassName).GetConstructors();

return (ClassName)ctor.Invoke(new object[0]);

对被调用的函数进行Mock,使其调用自己的函数,函数里只有类似与isCalled = true这样的语句即可。

事件也可以Mock

ConnectedController.Test.cs有上面说的一些例子。

===============================

这里需要注意两个函数:GenerateStub<T> & GenerateMock<T> 

更正:自己试了下,这两个函数都可以用。建议使用GenerateStub,可以为属性赋值。

如果只是做简单实例化一个接口,不需要对该接口函数的输出有任何的要求,那就用GenerateStub。

如果UT的结果需要依据这个接口函数的输出,就要使用GenerateMock。(随后调用Stub)

所以UT代码中,GenerateStub一般调用一次就够了。 GenerateMock可能就需要调用多次。

you should use a mock when you are going to verify that something happened on the object, like a method was called. You should use a stub when you just want the object to be involved in the test to return a value but it is not the thing you are testing. A stub which does not have a expectation fulfilled can never fail a test.

 

I think the general rule should be that you should only ever have a single mock object in a test, but may have several stubs which provide information to the mock object. I believe that more than 1 mock in a test is a code smell.

 

二,Live Unit Testing

Vs2017中的Live Unit Testing功能非常牛,让你一边写UT,一边就看到UT的执行结果,和被测试类的覆盖率。

具体介绍:http://www.dotnetcurry.com/visualstudio/1363/live-unit-testing-visual-studio-2017

另外面向接口编程,做UT的时候,应该都会用到Mock。项目中使用的Rhino.Mocks

具体介绍:https://spin.atomicobject.com/2017/08/07/intro-mocking-moq/

 

三,How to: Deploy Files for Tests

https://msdn.microsoft.com/en-us/library/ms182475.aspx

### 如何对 `@NotBlank` 注解的字段进行 JUnit 单元测试 为了验证请求体中的字段是否符合 `@NotBlank` 的约束条件,可以通过模拟 Controller 层的行为并使用 MockMvc 来发送 HTTP 请求来进行单元测试。以下是详细的说明和代码示例。 #### 测试环境准备 在 Spring Boot 中,可以利用 `MockMvc` 对 Controller 进行独立于实际运行环境的测试。同时,需要确保 Bean 和 Service 被正确 mock 出来以隔离依赖项[^1]。 #### 示例代码 假设有一个 DTO 类 `ChallengeAttemptDTO`,其中某些字段标注了 `@NotBlank`: ```java import javax.validation.constraints.NotBlank; public class ChallengeAttemptDTO { @NotBlank(message = "Name cannot be blank") private String name; // Getter and Setter methods public String getName() { return name; } public void setName(String name) { this.name = name; } } ``` 对应的 Controller 方法可能如下所示: ```java @PostMapping("/challenge") public ResponseEntity<ChallengeAttempt> postResult(@RequestBody @Valid ChallengeAttemptDTO challengeAttemptDTO) { return ResponseEntity.ok(challengeService.verifyAttempt(challengeAttemptDTO)); } ``` #### 编 JUnit 测试案例 下面是一个完整的 JUnit 测试案例,用于验证当 `name` 字段为空或仅包含空白字符时是否会触发校验错误。 ```java @SpringBootTest @AutoConfigureMockMvc class ChallengeControllerTest { @Autowired private MockMvc mockMvc; @MockBean private ChallengeService challengeService; @Test void testPostWithInvalidRequest_ShouldReturnBadRequest() throws Exception { // 创建一个不符合 @NotBlank 约束的对象 ChallengeAttemptDTO invalidDto = new ChallengeAttemptDTO(); invalidDto.setName(""); // 设置为空字符串 ObjectMapper objectMapper = new ObjectMapper(); // 发送 POST 请求并期望返回 400 Bad Request 响应码 mockMvc.perform(post("/challenge") .contentType(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(invalidDto))) .andExpect(status().isBadRequest()) .andExpect(jsonPath("$.message", containsString("Name cannot be blank"))); // 验证响应消息 } @Test void testPostWithValidRequest_ShouldReturnOkResponse() throws Exception { // 创建一个符合 @NotBlank 约束的对象 ChallengeAttemptDTO validDto = new ChallengeAttemptDTO(); validDto.setName("John Doe"); when(challengeService.verifyAttempt(validDto)).thenReturn(new ChallengeAttempt()); ObjectMapper objectMapper = new ObjectMapper(); // 发送 POST 请求并期望返回 200 OK 响应码 mockMvc.perform(post("/challenge") .contentType(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(validDto))) .andExpect(status().isOk()); } } ``` 上述代码中: - 使用了 `MockMvc` 执行 HTTP 请求。 - 当传入的数据违反 `@NotBlank` 约束时,Spring 自动抛出异常,并返回状态码 400 及相应的错误信息[^2]。 - 如果数据有效,则调用服务层逻辑并返回成功响应。 #### 关键点解析 1. **Mocking Service Layer**: 在测试过程中,通过 `@MockBean` 将 `ChallengeService` 替换为 mock 实现,从而专注于 Controller 行为而不涉及真实的服务逻辑。 2. **Validation Integration**: 添加 `@Valid` 注解到 Controller 参数上,使 Spring 启用内置的 Hibernate Validator 支持,进而处理诸如 `@NotBlank` 的约束条件。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值