问题标签 [mockito]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Mockito 与 JMockit 之间的比较 - 为什么 Mockito 的投票比 JMockit 好?
我正在研究为我的项目使用哪个模拟框架,并将其范围缩小到JMockit和Mockito。
我注意到Mockito在 Stackoverflow上被评为“ Java 的最佳模拟框架”。
在比较JMockit的“模拟工具比较矩阵”的功能时,似乎JMockit具有多个不同的功能。
有没有人有任何关于Mockito可以做什么而JMockit无法实现的具体信息(不是意见),反之亦然?
java - Mockito 重新存根方法已经用 thenthrow 存根
我遇到了mockito的问题。我正在开发一个网络应用程序。在我的测试中,用户管理被嘲笑了。在某些情况下,我必须更改该getLoggedInUser()
方法返回的用户。
问题是,我的getLoggedInUser()
方法也可以抛出AuthenticationException
.
因此,当我尝试从无用户切换到某个用户时,调用
抛出一个异常,因为userProvider.getLoggedInUser()
它已经被存根了thenTrow()
有没有办法告诉该when
方法不关心异常?
提前致谢 - 伊斯特万
java - 有没有办法在 Mockito 的验证方法中使用类似 jUnit Assert 消息参数的方法?
让我们假设一段测试代码:
Mockito.verify
如果模型中的方法没有调用方法,则方法抛出异常Observable.setChanged()
。
问题:如果不添加loggers/System.print.out
,我无法意识到测试失败的当前方法是什么。有没有一种类似于方法的jUnit Assert
方法:
解决方案:
java - Mockito 中的存根默认值
如何存根一个方法,以便在给定一个我不期望的值时,它返回一个默认值?
例如:
第 2 部分:如上,但抛出异常:
在上面的示例中,最后一个存根优先,因此映射将始终返回默认值。
java - 如何告诉 Mockito 模拟对象在下次调用时返回不同的东西?
所以,我在类级别创建一个模拟对象作为静态变量,就像这样......在一个测试中,我想Foo.someMethod()
返回一个特定的值,而在另一个测试中,我希望它返回一个不同的值。我遇到的问题是,我似乎需要重建模拟才能使其正常工作。我想避免重建模拟,并在每个测试中使用相同的对象。
在第二个测试中,当 testObj.bar() 被调用时,我仍然收到 0 作为值......解决这个问题的最佳方法是什么?请注意,我知道我可以Foo
在每个测试中使用不同的模拟,但是,我必须链接多个请求mockFoo
,这意味着我必须在每个测试中进行链接。
java - 使用 mockito 进行单元测试(部分模拟)
我对 Mockito 有疑问。
有没有可能做这样的事情:
我正在使用 Mockito 1.7。
我看到有一个“间谍”系统,但他们说不建议在我们测试的项目上使用它(为什么?)......
无论如何,我尝试了那个间谍功能,但我得到了一个奇怪的行为。
检查我想要做什么:
真实代码:
测试代码:
正如他们所说,我避免了可能是间谍问题的 when thenReturn 语法(但无论如何它也不起作用)
奇怪的是: assertTrue( x.methodB(argument).equals("good") ); 没问题
只有第二个 assertTrue( x.methodA(argument).equals("good") ); 不行
实际上 helper.methodA(argument) 返回 "toto" -> 真实结果而不是模拟结果
在这种情况下,不可能告诉 mockito 返回“好”???似乎当测试类调用methodB时没问题,但是如果间谍的方法调用methodB它就不再起作用了......
我不知道该怎么办......对同一个类的2个方法进行单元测试并让测试彼此独立以使一个著名的模拟测试框架无法实现这个基本功能是不是很奇怪? ? 这不就是我们所说的真正的单元测试吗?不明白为什么他们说要避免对被测对象使用 spy 方法...
谢谢
java - 测试具有带参数的构造函数的抽象类
我必须测试实现其中一个接口的抽象类之一。抽象类有一个带参数的构造函数。我使用 Mockito 作为测试框架。那么,如果我需要调用抽象类中的方法,最好的方法应该是什么?
如果我尝试对抽象类进行子类化,它会要求实现参数构造函数并且不允许编写无参数构造函数。此外,如果我尝试在没有无参数构造函数的情况下模拟一个类,并将 sysouts 放入方法中,通常我看不到它们被调用(被模拟的类是否需要强制的无参数构造函数?)尽管没有 junit 失败。
请帮忙。提前致谢。
java - Mockito 抱怨错误的论点
我们尝试使用 Mockito 验证操作的行为。测试代码如下所示
方法 actionPerformed 仅包含对 Type1 的构造函数中提供的对象的 someMethod 调用。然而,Mockito 抱怨没有发生预期的方法调用,而是发生了不同的方法调用。但是 Mockito 打印的两个调用的字符串表示是完全一样的!
任何解释发生了什么?
更新:来自 Mockito 的 ErrorMessage
java - 如何使用 Mockito 将参数锁定为存根方法
问候。
我正在嘲笑一个搜索引擎以在我的网络应用程序中进行测试。此搜索引擎返回具有不同模式的 xml 文档。架构取决于称为集合集的参数。基于集合集返回不同的模式是难以模拟的部分,因为指定集合集基本上是一种设置方法,并且是无效的。这个搜索引擎是一个外部 jar 文件,所以我不能修改 API。我必须使用所提供的东西。这是一个例子:
然后对于每个文档,我可以通过调用获取 xml:
当我使用我的模拟对象时,getDocumentText()
返回一个由生成器创建的符合架构的 xml 字符串。我想要做的是使用不同类型的生成器,具体取决于上面第一个代码片段的步骤 3 中提供的集合集。我一直在尝试做这样的事情:
但这会导致大量红色突出显示:)
基本上,我的目标是关闭,addCollectionSet(someCollectionSet)
以便在调用它时,我可以关闭参数并确保使用不同的生成器。有谁知道我怎么能完成这样的事情?或者是否有某种形式的依赖注入可以用来有条件地连接我的生成器?
谢谢!
更新
我已经更改了我的工厂对象,使其永远不会返回引擎,而是来自该引擎的 Search 和 Find 对象,所以现在我可以执行以下操作:
Search search = factory.getSearch(collectionSet);
所以我想做的是这样的:
换句话说,我仍然想关闭在 switch 语句中传递给 getSearch 的字符串。诚然,我可以做一些更像菲利克斯在下面建议的事情,但我宁愿把我所有的箱子都包在一个开关里。有人可以提供一个如何做到这一点的例子吗?谢谢!
更新
我已经看到您可以捕获传递给模拟调用的参数,但是这些捕获的参数用于以后的断言。我还没有看到一种方法可以关闭这些参数,以便对我的模拟的调用将根据参数返回不同的值。似乎必须有一种方法可以做到这一点,我只是没有足够的 Mockito 经验来解决这个问题。但肯定有人这样做!
java - 如何重新初始化我的 bean
我的 applicationContext-test.xml 中有一个 bean,用于模拟外部搜索引擎。这样,当我运行测试时,只要我的应用程序代码引用这个搜索引擎,我就知道我使用的是我的模拟引擎而不是真正的引擎。
我面临的一个问题是我希望这个引擎在不同的场景中表现不同。例如,当我调用 时getDocuments()
,我通常希望它返回文档。但有时我希望它抛出异常以确保我的应用程序代码正确处理异常。
我可以通过在我的测试代码中引用 bean 并更改一些存根来实现这一点,但是我必须将存根改回原来的样子,以便我的其他测试也能通过。由于许多原因,这似乎是不好的做法,所以我正在寻找替代方案。
我考虑的一种替代方法是完全重新初始化 bean。bean 使用静态工厂方法从 applicationContext-test.xml 初始化。我想做的是:
- 从我的测试代码中引用 bean 来更改它的一些存根
- 使用这些新存根运行测试
- 在此测试结束时,使用 applicationContext-test.xml 中指定的静态工厂方法重新初始化 bean
我试过这样的事情:
但这并不能解决问题。在此之后运行的任何测试仍然会失败。似乎我的新factory
变量包含Factory
我想要的并相应地表现,但是当 bean 在其他地方引用时,getDocuments()
仍然会抛出之前存根的异常。显然,我的重新初始化只影响了局部变量,而不影响 bean 本身。
有人可以告诉我如何实现我的目标吗?
更新
虽然我很欣赏关于如何编写更好的测试和更好的模拟的建议,但我的目标是重新初始化一个 bean。我相信无论是否适合我的用例,学习如何做到这一点都是有价值的(我相信它确实适合我的用例,但我很难在这里说服我的一些批评者)。
唯一能让我投赞成票或绿色勾号的答案是那些建议我如何重新初始化我的 bean 的答案。