我正在尝试使用Mockito测试一些遗留代码.
我想FooDao在生产中使用如下的存根:
foo = fooDao.getBar(new Bazoo());
Run Code Online (Sandbox Code Playgroud)
我可以写:
when(fooDao.getBar(new Bazoo())).thenReturn(myFoo);
Run Code Online (Sandbox Code Playgroud)
但显而易见的问题是,getBar()永远不会使用Bazoo我为该方法存根的相同对象调用.(诅咒那个new操作员!)
如果我能以一种myFoo不管参数而返回的方式存根方法,我都会喜欢它.如果做不到这一点,我会听取其他的解决方法建议,但我真的希望避免更改生产代码,直到有合理的测试覆盖率.
我想将一个Mockito模拟对象注入一个Spring(3+)bean中,以便使用JUnit进行单元测试.我的bean依赖项目前通过@Autowired在私有成员字段上使用注释来注入.
我考虑过使用ReflectionTestUtils.setField但我希望注入的bean实例实际上是一个代理,因此不会声明目标类的私有成员字段.我不希望为依赖创建一个公共setter,因为我将修改我的界面纯粹是为了测试的目的.
我遵循了Spring社区给出的一些建议,但是没有创建模拟并且自动连线失败:
<bean id="dao" class="org.mockito.Mockito" factory-method="mock">
<constructor-arg value="com.package.Dao" />
</bean>
Run Code Online (Sandbox Code Playgroud)
我目前遇到的错误如下:
...
Caused by: org...NoSuchBeanDefinitionException:
No matching bean of type [com.package.Dao] found for dependency:
expected at least 1 bean which qualifies as autowire candidate for this dependency.
Dependency annotations: {
@org...Autowired(required=true),
@org...Qualifier(value=dao)
}
at org...DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(D...y.java:901)
at org...DefaultListableBeanFactory.doResolveDependency(D...y.java:770)
Run Code Online (Sandbox Code Playgroud)
如果我将constructor-arg值设置为无效,则在启动应用程序上下文时不会发生错误.
有没有办法使用mockitos ArgumentCaptore捕获特定类型的列表.这不起作用:
ArgumentCaptor<ArrayList<SomeType>> argument = ArgumentCaptor.forClass(ArrayList.class);
Run Code Online (Sandbox Code Playgroud) 我想通过mockito验证验证方法是否被调用两次或多次.我使用验证,它抱怨像这样:
org.mockito.exceptions.verification.TooManyActualInvocations:
Wanted 1 time:
But was 2 times. Undesired invocation:
Run Code Online (Sandbox Code Playgroud) 是否有一种使用泛型参数模拟类的干净方法?假设我必须模拟一个Foo<T>我需要传递给期望a的方法的类Foo<Bar>.我可以很容易地做到以下几点:
Foo mockFoo = mock(Foo.class);
when(mockFoo.getValue).thenReturn(new Bar());
Run Code Online (Sandbox Code Playgroud)
假设getValue()返回泛型类型T.但是当我稍后将它传递给期望的方法时,那将会有小猫Foo<Bar>.铸造是这样做的唯一方法吗?
有没有办法让stubbed方法在后续调用中返回不同的对象?我想这样做来测试一个非确定的响应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 = 0; i < calls.size(); i ++) {
try {
T t = completionService.take().get();
// do some stuff that I want to test
} catch (...) { } …Run Code Online (Sandbox Code Playgroud) 我在这里读了几个关于静态方法的线程,我想我明白了误用/过度使用静态方法会导致的问题.但我并没有真正了解为什么很难模拟静态方法.
我知道其他嘲笑框架,如PowerMock,可以做到这一点,但为什么不能Mockito?
我读过这篇文章,但作者似乎在虔诚地反对这个词static,也许这是我理解不足的原因.
一个简单的解释/链接将是伟大的.
我有一个方法调用,我想用mockito模拟.首先,我创建并注入了一个将在其上调用方法的对象实例.我的目的是验证方法调用中的一个对象.
有没有一种方法可以让mockito在调用mock方法时断言或验证对象及其属性?
例
Mockito.verify(mockedObject)
.someMethodOnMockedObject(
Mockito.<SomeObjectAsArgument>anyObject())
Run Code Online (Sandbox Code Playgroud)
而不是anyObject()我想检查该参数对象包含一些特定的字段
Mockito.verify(mockedObject)
.someMethodOnMockedObject(
Mockito.<SomeObjectAsArgument>**compareWithThisObject()**)
Run Code Online (Sandbox Code Playgroud) 使用Mockito,我想在其参数列表中verify()进行方法调用byte[],但我没有找到如何编写它.
myMethod( byte[] )
Run Code Online (Sandbox Code Playgroud)
我只是想要一些类似的东西anyByteArray(),如何用Mockito做到这一点?