【问题标题】:Mockito @Spy calls real method while mocking behaviour is definedMockito @Spy 在定义模拟行为时调用真实方法
【发布时间】:2020-12-01 07:41:41
【问题描述】:

我有一个由控制器和服务层组成的常见 Spring Boot 应用程序。不涉及数据库,因为我使用另一个rest api来存储数据。

现在我想要我的控制器,因此我想部分地模拟我的服务。部分原因是我有一种方法可以接受 dto 并将其转换为我的业务模型。我知道这也可以通过业务模型的构造函数来解决,但无论如何我遇到了以下问题:

代码

控制器

@RestController
public class RegistrationController {

@Autowired
private UserRegistrationService userRegistrationService;

@PostMapping(value = "/user", consumes = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<UserId> createUser(@RequestBody @Valid UserDto userDto) {
    KeycloakUserRepresentation keycloakUserRepresentation = userRegistrationService.convertUserDtoToKeycloakUserRepresentation(userDto);
    UserId userId = userRegistrationService.createNewUser(keycloakUserRepresentation);
    return new ResponseEntity<>(userId,HttpStatus.CREATED);
}

测试

@SpringBootTest
@AutoConfigureMockMvc
@ExtendWith({RestDocumentationExtension.class})
@AutoConfigureRestDocs
class RegistrationControllerRegistrationTest {

    private static final UserDto testUsertDto = new UserDto();

    @Autowired
    private MockMvc mockMvc;
    @Autowired
    private ObjectMapper objectMapper;
    @Spy
    private UserRegistrationServiceImpl userRegistrationService;

在我的测试方法中我定义:

doReturn(testUserId).when(userRegistrationService).createNewUser(any(KeycloakUserRepresentation.class));

问题:

我希望虽然在我的测试中没有定义 doSomething,但将 userDto 转换为 keycloak 表示是由原始方法完成的。当我在控制器中调试时,这似乎起作用,keycloakUserRepresentation 具有正确的值。问题是在下一步中

createNewUser

方法没有被存根/模拟。执行了原始方法,因此我的测试失败了。 我想要的是,当我在我的测试用例中提供一个 doSomething 方法时,我希望原始方法被模拟。

【问题讨论】:

    标签: spring spring-boot mockito spring-test springmockito


    【解决方案1】:

    这似乎在我在控制器中调试时起作用 keycloakUserRepresentation 具有正确的值。

    它起作用了,因为 bean 根本没有被监视。尽管@Spy 可能有助于创建模拟对象,但它不会在您的测试应用程序上下文中生成模拟的Spring bean。使用 @SpyBean 让 Mockito 监视 Spring 应用程序上下文中的 bean。

    【讨论】:

      猜你喜欢
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-28
      • 1970-01-01
      • 1970-01-01
      • 2020-11-11
      相关资源
      最近更新 更多