gpt4 book ai didi

java - 消息新对象和使用静态方法的测试方法

转载 作者:行者123 更新时间:2023-12-01 09:02:22 24 4
gpt4 key购买 nike

我有一个非常简单的方法,它使用 Spring 框架,除了与注入(inject)的服务交互之外,还必须新建一个对象,然后使用静态方法获取另一个对象,如下所示:

// These two guys are injected:
UserDetailsService userDetailsService;
AuthenticationManager authManager;

UserDetails userDetails = userDetailsService.loadUserByUsername(name);

Authentication token = new UsernamePasswordAuthenticationToken(userDetails,
password, userDetails.getAuthorities());

Authentication authentication = authenticationManager.authenticate(token);

SecurityContextHolder.getContext().setAuthentication(authentication);

我应该如何测试它(确保调用方法并将正确的参数传递给它们)?我不能简单地模拟 UsernamePasswordAuthenticationTokenSecurityContextHolder。我可以为这两件事创建工厂,这可以解决问题,但对于像这样简单的事情来说,感觉像是一个巨大的杀伤力。另外,我还必须测试工厂。还有别的办法吗?

最佳答案

@KlausGroenbaek 的答案描述了使用 JUnit 框架完成的模块测试验收测试。这是一种重要的测试类型,并且绝对是您想要做的事情。

但这不是单元测试

UnitTests 单独测试您的代码的一小部分的行为,这意味着您的单元与之通信的任何内容都应该是模拟或数据传输对象 (DTO)(或者“太简单而不会失败”)。

<小时/>

当我尝试将其采用到您的代码中时,您应该重构静态方法调用 SecurityContextHolder.getContext() 并通过以下方式获取其结果(上下文?) package private getter 或将其也注入(inject)到您的类中。

然后,您可以使用 Mockito 或任何其他模拟框架来模拟三个依赖项 contextuserDetailsS​​erviceauthManager。对于package private getter,请使用Mockito.spy()Mockito.doReturn(cotextMock).when(myClass.getContext()) (或您选择的模拟框架的等效项)。
使用 Mockito 时,我更喜欢这种带有 spy 对象的形式,因为它不会像更常见的 when().thenReturn() 那样执行模拟方法形式确实如此。

可以通过捕获方法调用authenticationManager.authenticate(token)的参数来间接检查UsernamePasswordAuthenticationToken的实例化。 Mockito 有用于此目的的 ArgumentCaptor util 类。

关于java - 消息新对象和使用静态方法的测试方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41573391/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com