首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mockito @Spy调用真正的方法,同时定义模拟行为

Mockito @Spy调用真正的方法,同时定义模拟行为
EN

Stack Overflow用户
提问于 2020-12-01 07:41:41
回答 1查看 414关注 0票数 0

我有一个由控制器和服务层组成的通用弹簧引导应用程序。不涉及数据库,因为我使用另一个rest来存储数据。

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

控制器

代码语言:javascript
复制
@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);
}

测试

代码语言:javascript
复制
@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;

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

代码语言:javascript
复制
doReturn(testUserId).when(userRegistrationService).createNewUser(any(KeycloakUserRepresentation.class));

问题:

我希望,虽然在我的测试中没有定义doSomething,但userDto到密钥披风表示的转换是由原始方法完成的。这看起来像我在我的控制器中调试时一样,keycloakUserRepresentation有正确的值。问题是,在下一步中,

createNewUser

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

EN

回答 1

Stack Overflow用户

发布于 2020-12-01 09:21:11

--这就像我在我的控制器中调试时一样,keycloakUserRepresentation具有正确的值。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65086465

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档