Questions tagged «mocking»

模拟和伪造是隔离代码或组件的方法,以确保单元测试仅针对可测试的代码单元运行,而无需实际利用其他组件或应用程序的依赖项。模拟与伪造的不同之处在于,可以检查模拟以断言测试结果。


10
如何使用Mockito模拟void方法
如何用void返回类型模拟方法? 我实现了一个观察者模式,但是我无法用Mockito对其进行模拟,因为我不知道如何做。 我试图在Internet上找到一个例子,但没有成功。 我的课看起来像这样: public class World { List<Listener> listeners; void addListener(Listener item) { listeners.add(item); } void doAction(Action goal,Object obj) { setState("i received"); goal.doAction(obj); setState("i finished"); } private string state; //setter getter state } public class WorldTest implements Listener { @Test public void word{ World w= mock(World.class); w.addListener(this); ... ... …

11
伪造,嘲笑和存根之间有什么区别?
我知道我如何使用这些术语,但是我想知道是否存在用于单元测试的伪造,模拟和存根的定义?您如何为测试定义这些?描述您可能会使用每种情况的情况。 这是我的用法: Fake:实现接口但包含固定数据且没有逻辑的类。只需根据实现返回“好”或“坏”数据。 Mock:实现接口的类,并允许动态设置要返回的值/从特定方法抛出的异常,并提供检查是否已调用特定方法的能力。 存根(Stub):类似于模拟类,不同之处在于它不提供验证方法是否已被调用的能力。 模拟和存根可以手动生成,也可以由模拟框架生成。伪类是手工生成的。我主要使用模拟来验证我的类和依赖类之间的交互。一旦验证了交互作用并测试了代码中的替代路径,便会使用存根。我主要使用伪造的类来抽象出数据依赖关系,或者当模拟/存根过于繁琐而无法每次设置时。



6
Mockito能否捕获多次调用的方法的参数?
我有一个被调用两次的方法,并且我想捕获第二个方法调用的参数。 这是我尝试过的: ArgumentCaptor<Foo> firstFooCaptor = ArgumentCaptor.forClass(Foo.class); ArgumentCaptor<Foo> secondFooCaptor = ArgumentCaptor.forClass(Foo.class); verify(mockBar).doSomething(firstFooCaptor.capture()); verify(mockBar).doSomething(secondFooCaptor.capture()); // then do some assertions on secondFooCaptor.getValue() 但是我得到一个TooManyActualInvocations例外,因为Mockito认为doSomething应该只调用一次。 如何验证第二个调用的参数doSomething?

5
使用Mockito模拟某些方法,但不模拟其他方法
使用Mockito,有什么方法可以模拟类中的某些方法,而不能模拟其他方法? 例如,在这个(当然是人为设计的)Stock类中,我想模拟getPrice()和getQuantity()返回值(如下面的测试代码所示),但我想getValue()按Stock类中的编码执行乘法 public class Stock { private final double price; private final int quantity; Stock(double price, int quantity) { this.price = price; this.quantity = quantity; } public double getPrice() { return price; } public int getQuantity() { return quantity; } public double getValue() { return getPrice() * getQuantity(); } @Test …
402 java  mocking  mockito 

2
Mockito测试void方法会引发异常
我有一个带有void返回类型的方法。它还可以引发许多异常,因此我想测试所引发的异常。所有尝试均以相同的原因失败: Stubber类型中的when(T)方法不适用于参数(void) 有什么想法可以获取引发指定异常的方法吗? doThrow(new Exception()).when(mockedObject.methodReturningVoid(...));

3
返回传递给方法的值
我在接口上有一个方法: string DoSomething(string whatever); 我想用最小起订量来模拟它,以便它返回传入的内容-类似于: _mock.Setup( theObject => theObject.DoSomething( It.IsAny<string>( ) ) ) .Returns( [the parameter that was passed] ) ; 有任何想法吗?
390 c#  mocking  moq 

11
用Mockito模拟静态方法
我已经写了一家工厂来生产java.sql.Connection物体: public class MySQLDatabaseConnectionFactory implements DatabaseConnectionFactory { @Override public Connection getConnection() { try { return DriverManager.getConnection(...); } catch (SQLException e) { throw new RuntimeException(e); } } } 我想验证传递给的参数DriverManager.getConnection,但不知道如何模拟静态方法。我在测试用例中使用的是JUnit 4和Mockito。有没有模拟或验证此特定用例的好方法?

14
Java的最佳模拟框架是什么?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 8年前关闭。 已锁定。该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。它目前不接受新的答案或互动。 在Java中创建模拟对象的最佳框架是什么?为什么?每个框架的优缺点是什么?

7
对数据库驱动的应用程序进行单元测试的最佳策略是什么?
我使用由后端复杂程度各异的数据库驱动的许多Web应用程序。通常,有一个与业务和表示逻辑分开的ORM层。这使得对业务逻辑进行单元测试相当简单。事情可以在离散模块中实现,并且测试所需的任何数据都可以通过对象模拟来伪造。 但是测试ORM和数据库本身始终充满问题和妥协。 多年来,我尝试了一些策略,但没有一个完全令我满意。 用已知数据加载测试数据库。针对ORM运行测试,并确认返回正确的数据。此处的缺点是测试数据库必须跟上应用程序数据库中的所有架构更改,并且可能不同步。它还依赖于人工数据,并且可能不会暴露由于愚蠢的用户输入而发生的错误。最后,如果测试数据库很小,它将不会像索引丢失那样显示低效率。(好吧,最后一个并不是真正的单元测试应该使用什么,但这没有什么害处。) 加载生产数据库的副本并对此进行测试。这里的问题是您可能在任何给定时间都不知道生产数据库中的内容。如果数据随时间变化,则可能需要重写测试。 有人指出,这两种策略都依赖于特定的数据,并且单元测试应该仅测试功能。为此,我看到了建议: 使用模拟数据库服务器,并仅检查ORM是否正在响应给定方法调用而发送正确的查询。 您使用了哪些策略来测试数据库驱动的应用程序(如果有)?什么对您最有效?

4
Mockito可以在不考虑参数的情况下对方法进行存根吗?
我正在尝试使用Mockito测试一些旧代码。 我想存根FooDao在生产中使用的a ,如下所示: foo = fooDao.getBar(new Bazoo()); 我可以写: when(fooDao.getBar(new Bazoo())).thenReturn(myFoo); 但是明显的问题是,getBar()从来没有使用与Bazoo我存根方法相同的对象来调用它。(请该new运算符!) 如果我可以以不myFoo考虑参数的方式返回该方法的方法来对它进行存根,我将非常喜欢。失败的话,我会听取其他解决方法的建议,但我真的想避免更改生产代码,直到有合理的测试范围为止。

9
将Mockito与具有相同参数的多次调用相同方法一起使用
有一种方法可以使存根方法在后续调用中返回不同的对象吗?我想这样做是为了测试来自的不确定响应ExecutorCompletionService。即,不管方法的返回顺序如何进行测试,结果都保持恒定。 我要测试的代码看起来像这样。 // Create an completion service so we can group these tasks together ExecutorCompletionService<T> completionService = new ExecutorCompletionService<T>(service); // Add all these tasks to the completion service for (Callable<T> t : ts) completionService.submit(request); // As an when each call finished, add it to the response set. for (int i …
289 java  mocking  mockito 

7
如何使用Jest模拟ES6模块导入?
我开始认为这是不可能的,但是无论如何我都想问。 我想测试我的一个ES6模块以特定方式调用另一个ES6模块。有了茉莉花,这非常容易- 应用程式码: // myModule.js import dependency from './dependency'; export default (x) => { dependency.doSomething(x * 2); } 和测试代码: //myModule-test.js import myModule from '../myModule'; import dependency from '../dependency'; describe('myModule', () => { it('calls the dependency with double the input', () => { spyOn(dependency, 'doSomething'); myModule(2); expect(dependency.doSomething).toHaveBeenCalledWith(4); }); }); 笑话相当于什么?我觉得这是一件很想做的简单的事情,但是我一直在努力尝试弄清头发。 我最接近的方法是将imports …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.