gpt4 book ai didi

Java Mockito.when 以 StringBuilder 作为参数失败

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:06:52 25 4
gpt4 key购买 nike

下面是 JUnit 测试,oneLoginAuthUtil 是 Mocked。但是 Mockito.when 正在返回 nulloneLoginAuthUtil.getMetaData 始终为 null。下面是代码 -

public void func() throws Exception {
StringBuilder b = new StringBuilder("test");
RequestContext context = new RequestContext();
Mockito.when(oneLoginAuthUtil.getMetaData(context, b)).thenReturn("abcdef");
ResponseEntity<Object> response = loginControllerImpl.handleGetMetaDataEndPointImpl(context);
}

public String getMetaData(RequestContext context, StringBuilder b) throws Exception {
Auth auth = getOneLoginAuthObject(context);
final Saml2Settings settings = auth.getSettings();
String metadata = settings.getSPMetadata();
List<String> errors = Saml2Settings.validateMetadata(metadata);
if (!errors.isEmpty()) {
b.append(errors.toString());
throw new SSOException("metadata_validation_error");
}
return metadata;
}

public ResponseEntity<Object> handleGetMetaDataEndPointImpl(RequestContext context) {
try {
StringBuilder b = new StringBuilder();
String metadata = oneLoginAuthUtil.getMetaData(context, b);
log.info(metadata);
return new ResponseEntity<>(metadata, new HttpHeaders(), HttpStatus.CREATED);
} catch (Exception e) {
return new ResponseEntity<>("<error>Exception: " + e.getMessage() + "</error>", new HttpHeaders(),
HttpStatus.CREATED);
}
}

但是没有 StringBuilder 作为参数的 oneLoginAuthUtil.getMetaData 方法工作正常。

最佳答案

它返回 null 因为当你模拟一个使用特定实例作为参数的方法时,Mockito 将返回映射的返回值当且仅当测试时提供的参数等于你在测试时提供的参数 mock 显然不是这样。 Mockito 没有匹配项,因此它返回一个方法的默认值,该方法返回一个在 null 模拟上调用的对象。

换句话说 Mockito.when(oneLoginAuthUtil.getMetaData(context, b)) 等同于 Mockito.when(oneLoginAuthUtil.getMetaData(Mockito.eq(context), Mockito.eq (b))),这里由于类 StringBuilder 没有覆盖方法 equals(Object obj),mocking 时提供的实例不等于测试时提供的实例,因为它们不是同一个实例(依赖于 equals(Object obj) 的默认实现时唯一相等的可能性),这样你就会得到这种行为。

所以你应该使用 Mockito.any(StringBuilder.class) 来匹配 StringBuilder 类型的任何实例,这样实例就不再需要相等了,你的代码将是:

Mockito.when(
oneLoginAuthUtil.getMetaData(Mockito.eq(context), Mockito.any(StringBuilder.class))
).thenReturn("abcdef");

假设您的主类是 LoginControllerImpl 并且它有一个类型为 OneLoginAuthUtil 的成员字段 oneLoginAuthUtil,您可以使用注解 @InjectMocks 直接注入(inject)你的 mock 类型 OneLoginAuthUtil,完整的代码将是:

@RunWith(MockitoJUnitRunner.class)
public class LoginControllerImplTest {

@Mock
private OneLoginAuthUtil oneLoginAuthUtil;
@InjectMocks
private LoginControllerImpl loginControllerImpl;

@Test
public void func() throws Exception {
RequestContext context = new RequestContext();
Mockito.when(
oneLoginAuthUtil.getMetaData(
Mockito.eq(context), Mockito.any(StringBuilder.class)
)
).thenReturn("abcdef");

ResponseEntity<Object> response
= loginControllerImpl.handleGetMetaDataEndPointImpl(context);
...
}
}

关于Java Mockito.when 以 StringBuilder 作为参数失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41959519/

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