如何配置Mockito返回除1之外的任意整数?
解决Mockito返回不等于1的任意整数的问题
嘿,我懂你想实现的效果——让Mockito返回一个不等于1的任意整数,但你当前尝试的thenReturn(anyInt() != 1)是走不通的。原因有两个:一是anyInt()是Mockito的参数匹配器,用来匹配方法参数的,不能直接用来生成返回值;二是anyInt() !=1得到的是布尔值,和你方法返回的double类型不匹配。
下面给你两种可行的解决方案:
方案一:动态生成符合条件的返回值(推荐)
用Mockito的thenAnswer()方法来动态生成返回值,它允许你自定义返回逻辑。因为你的getItemNumber方法返回的是double,所以最后要把整数转成double类型:
import java.util.concurrent.ThreadLocalRandom; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; // Java 8+ 用Lambda写法 Mockito.when(dsIn.getItemNumber(1, "COLUMN")).thenAnswer(invocation -> { int randomInt; // 循环生成直到得到不等于1的整数 do { randomInt = ThreadLocalRandom.current().nextInt(); } while (randomInt == 1); return (double) randomInt; });
如果是Java 8之前的版本,用匿名内部类实现Answer接口:
Mockito.when(dsIn.getItemNumber(1, "COLUMN")).thenAnswer(new Answer<Double>() { @Override public Double answer(InvocationOnMock invocation) throws Throwable { int randomInt; do { randomInt = ThreadLocalRandom.current().nextInt(); } while (randomInt == 1); return (double) randomInt; } });
方案二:固定返回非1的整数(简单场景)
如果不需要真的“任意”,只是需要几个非1的整数轮着返回,可以直接用thenReturn()传入多个值:
// 每次调用依次返回2.0、3.0、4.0,都是不等于1的数值 Mockito.when(dsIn.getItemNumber(1, "COLUMN")).thenReturn(2.0, 3.0, 4.0);
这样每次调用mock方法时,会按顺序返回你指定的非1数值,适合简单的测试场景。
内容的提问来源于stack exchange,提问作者TacoB0t
相关产品推荐
相关产品推荐

