gpt4 book ai didi

java - 如何为原始类型创建 Mockito ArgumentCaptor?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:36:11 24 4
gpt4 key购买 nike

我正在尝试使用 Mockito 来捕获“int”类型的参数。

这是我正在测试的代码:

public class Client {

private final Board board;
private final Server server;

private void makeMove() {
nextMove = 11;
server.nextMove(nextMove);
}

public void moveAccepted(boolean accepted) {
if (accepted) {
board.updateBoard(nextMove);
} else {
...
}
}
}

这是测试代码:

@RunWith(MockitoJUnitRunner.class)
public class ClientTest {

private Client client;

@Mock
private Board mockBoard;

@Mock
private Server mockServer;

@Captor
private ArgumentCaptor<Integer> moveCaptor;

@Test
public void testGamePlay() {
client.forceNextMove();
verify(mockServer).nextMove(moveCaptor.capture()); // NPE here
client.moveAccepted(true);
verify(mockBoard).updateBoard(eq(moveCaptor.getValue()));
}
}

因此,在 try catch 传递给 server.nextMove 调用的值时,我在测试中遇到了 NullPointerException

我已经检查过了,那个 captor 不为空。如果我将 server.nextMove 的参数类型从 int 更改为 Integer 那么一切正常。

我也没有找到任何方法来创建类似“IntArgumentCaptor”的东西(比如匹配器的 anyInt)。

有什么方法可以使该测试工作,而无需将 server.next 移动到 Integer

最佳答案

您使用的是哪个版本的 Mockito?根据ArgumentCaptor's implementation ,您不需要做任何不同的事情。这比调用 any() 更聪明,例如,因为 ArgumentCaptor 必须通过 forClass 创建(通过它可以确定返回哪个原始类型)或 @Captor(可以读取字段类型并适当调用forClass)。

public T capture() {
Mockito.argThat(capturingMatcher);
return defaultValue(clazz);
}

Primitives.defaultValue :

/**
* Returns the boxed default value for a primitive or a primitive wrapper.
*
* @param primitiveOrWrapperType The type to lookup the default value
* @return The boxed default values as defined in Java Language Specification,
* <code>null</code> if the type is neither a primitive nor a wrapper
*/
public static <T> T defaultValue(Class<T> primitiveOrWrapperType) {
return (T) PRIMITIVE_OR_WRAPPER_DEFAULT_VALUES.get(primitiveOrWrapperType);
}

如果你的 NPE 来自你控制的代码,那么这是一个重要的标志:它表明 Mockito 在调用 verify 期间推迟到你的实现,这可能表明 Server. nextMove 是不可模拟的。如果 Server 是最终的,Server.nextMove 是最终的,或者以上任何一个是 protected 或包私有(private)的(因为某些版本的 Mockito 无法合成Java 编译器为使这些工作而创建的方法)。

如果您可以看到 ArgumentCaptor.capture() 在不应该返回的地方返回 null(与上面的代码相反),那么这听起来像是 Mockito错误。

关于java - 如何为原始类型创建 Mockito ArgumentCaptor?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42012169/

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