- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在 StackOverflow 上的第一个问题。我希望能够做类似的事情:
SomeClass mock = mock(SomeClass.class);
String methodName = "someMethod";或方法方法 = ...someMethod...
这两个东西(mock 和方法)将结合起来执行以下操作:
when(mock.someMethod()).thenReturn(null);
当然,'null' 值会根据我的需要进行相应更改,但我试图确定两件事:
1) 是否有可能在 Java 中执行类似this 的操作? This = 将类对象和方法组合到 methodCall 中。
2) 我该怎么做?
我一直在研究这个,但我找不到任何东西。问题是,即使这适用于常规类和常规方法(someClass 和 someMethod 会一起执行 someClass.someMethod()),请记住,这必须适用于模拟对象 用于 when() 调用。
回答:when(method.invoke(mock)).thenReturn("Hello world.");是正确的语法并且反射确实在 when() 调用中起作用。谢谢凯文韦尔克!
最佳答案
既然你基本上是让我重新发布我的评论,根据你的回复修改,作为答案,这里是:
尝试像这样使用反射:
when(method.invoke(mock)).thenReturn("Hello world.");
尽管如此,我不确定这对您有何作用,因为您不能模拟/监视类 Method
(它是最终的)。 Mockito 的 when()
仅适用于模拟或 spy 。如果这真的对你有用,你能发布更多细节吗?
如果它不起作用,您可以——正如我在 OP 的评论中所建议的那样——走 CGLib 路线并绕过 Mockito。这真的没有乍看起来那么难。在我的 OSS 项目中 Funcito (不是 模拟框架),我剥离了很多 Mockito CGLib 代理代码并根据我的需要重写了它。它为代理类和拦截方法调用的世界提供了一个更简单的 View 。
对评论的补充回复我知道这是如何为你工作的,但我不确定你是否真的理解它是如何工作的。这可能很重要,因为 Mockito 本身工作方式的 future 变化可能会导致您的解决方案在未来崩溃。从本质上讲,它起作用的原因几乎是偶然的,但它确实会起作用。
when()
应该工作的方式是括号之间发生的是对先前创建的 Mockito 生成的模拟或 spy 的方法调用,这只是类,而不是类的真实实例。代理具有特殊的逻辑,可以拦截伪造的代理方法调用,并将其添加到已注册的代理方法调用列表中(它存储在称为 IOngoingStubbing
或类似的东西中)供以后使用。由于 Java 在调用方法之前评估参数,这保证了代理方法调用在实际执行 when()
方法之前得到注册/记住。 when()
所做的是弹出此 IOngoingStubbing,然后它成为调用 thenReturns()
的对象。
您没有“正确”使用它,但它仍然适用于您。如何?好吧,所有需要发生的事情是需要调用代理上的方法,以便在执行 when()
之前在 IOngoingStubbing
中注册。您不是直接调用代理上的方法,而是通过将代理传递给 Method.invoke()
间接调用代理上的方法。因此满足条件,并且 when()
已经在 IOngoingStubbing
中注册了一个代理方法调用。
你可以在下面的代码中看到同样的“偶然”的快乐,一开始看起来毫无意义,直到你意识到 Mockito 的工作原理:
@Test
public void testSomething() throws Exception {
List listMock = mock(List.class);
Method m = List.class.getDeclaredMethod("get", int.class);
m.invoke(listMock, Mockito.anyInt());
when(null).thenReturn("Hello World"); // Huh? passing null?
assertEquals("Hello World", listMock.get(0)); // works!
}
上面的测试居然通过了!即使 when
的参数为 null,重要的是代理(即模拟)实例在调用 when
语句之前调用了正确的方法。
虽然 Mockito 不太可能改变幕后工作的基本方式,但在未来的某个时候它仍然有可能被打破。就像我说的,它起作用或多或少是一个幸运的意外。只要您了解它的工作方式和所涉及的风险,您就会拥有更多的力量。
关于java - Mockito:是否可以将 mock 与方法名称结合起来在 when() 调用中创建 methodCall?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10124482/
我有一段代码是这样的: while(count = inputStream.readLine()) != null) { //do something } 在单元测试用例中,我正在模拟 inp
我有一段代码是这样的: while(count = inputStream.readLine()) != null) { //do something } 在单元测试用例中,我正在模拟 inp
假设我在文件中具有以下命名导出 customer.ts export const saveDetails = ()=>{} export const loadDetails = ()=>{} 假设我在
我一直试图绕过dart的模拟库,但似乎我仍然不明白。 在我的库中,我有一个对外部资源的HTTP请求,我想以此模拟它不要一直依赖外部资源。 我的库中的主类如下所示: SampleClass(String
使用 postman 模拟服务器存在问题。它不响应具有路由参数的请求。例如,我的 uri 如下所示: PUT : {{server_url}}/order/{id} 但是当我以这种方式调用模拟服务器时
将任何转换器或空属性转换添加到 Jest 配置时,模拟无法正常工作。下面是简单的代码。 Jest 配置: "transform": { any regex: any transformer } 模块说
我最近一直在做一个项目,该项目已经开始变得相当依赖,并且一直在探索使用 AutoMocking 容器来清理我的测试并使其不那么脆弱的想法。 我听说过 TDD/BDD 纯粹主义者反对使用它们的论点,例如
有谁知道为什么 UsernameExists 不会返回 True。我的语法一定在某个地方搞砸了。 [TestMethod()] public void GenerateUsername
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题? Update the question所以它是on-topic对于堆栈溢出。 10年前关闭。 Improve this qu
我得到一个 Moq 对象以在连续调用方法时返回不同的值。这是通过此扩展方法完成的: public static void ReturnsInOrder(this ISetup setup, param
rhino-mocks stub 和这里的期望有什么区别:在我看来它们的行为完全相同? mockContext.Stub(x => x.Find()) .Return(new List()
我正在尝试模拟方法 extra_get() 的调用,该方法通常返回一个字典列表。据我从模拟docs了解,如果我想返回iterable,我应该设置side_effect参数。 client.extra_
在我的 CentOS 6.2 机器的/var/lib/mock 文件夹下,我可以看到目标构建操作系统中的所有初始应用程序。如果我想添加 JDK 作为额外的应用程序,我该怎么做?谢谢! 最佳答案 只需将
我正在寻找一种让 stub 的返回值取决于其输入的干净方法。 目前我正在使用以下方法,但效果不佳。 metadataLogic.Expect(x => x.GetMake(args.Vehicle1.
我正在设置调用构建和执行查询的方法的期望。我想询问所用参数的属性。这可能吗 using (mocks.Record()) { Expect.Call(connection.Retrieve(S
有没有人有一个使用 Rhino Mocks 和 NInject 的自动模拟容器的实现? 最佳答案 好的,我使用 Moq 集成作为起点自己构建了一个。这很简单。你需要这 3 个类: public cla
使用后@patch在我的装饰器上它不再起作用了。我想进行一个失败并引发异常的调用,以便我可以检查我的装饰器是否正在捕获此异常,并正在调用某个函数。 mock do_sth_in_db让它引发异常是很容
谁能告诉我为什么下面的测试没有失败? [Test] public void uhh_what() { var a = MockRepository.GenerateMock(); a.
我找不到 Moq 和 Rhino 的具体功能比较。所有的问题都是“你更喜欢哪个以及为什么”,或者“这是你如何在 rhino 中进行简单的模拟以及如何在最小起订量中完成的”。 我在任何地方都找不到深入的
我正在尝试模拟数据存储库对象,但在 MockRepository 上设置期望后,它每次都返回 null。我的代码如下: [测试] 公共(public)无效 GetById_NotNull() { 预
我是一名优秀的程序员,十分优秀!