用mockito模仿异步(< code>@Async)方法的最好方法是什么?提供以下服务:
@Service
@Transactional(readOnly=true)
public class TaskService {
@Async
@Transactional(readOnly = false)
public void createTask(TaskResource taskResource, UUID linkId) {
// do some heavy task
}
}
莫基托的验证如下:
@RunWith(SpringRunner.class)
@WebMvcTest(SomeController.class)
public class SomeControllerTest {
@Autowired
MockMvc mockMvc;
@MockBean
private TaskService taskService;
@Rule
public MockitoRule mockitoRule = MockitoJUnit.rule();
// other details omitted...
@Test
public void shouldVerify() {
// use mockmvc to fire to some controller which in turn call taskService.createTask
// .... details omitted
verify(taskService, times(1)) // taskService is mocked object
.createTask(any(TaskResource.class), any(UUID.class));
}
}
测试方法应该验证
上面将始终抛出:
org.mockito.exceptions.misusing.InvalidUseOfMatchersException:
Misplaced argument matcher detected here:
-> at SomeTest.java:77) // details omitted
-> at SomeTest.java:77) // details omitted
You cannot use argument matchers outside of verification or stubbing.
Examples of correct usage of argument matchers:
when(mock.get(anyInt())).thenReturn(null);
doThrow(new RuntimeException()).when(mock).someVoidMethod(anyObject());
verify(mock).someMethod(contains("foo"))
Also, this error might show up because you use argument matchers with methods that cannot be mocked.
Following methods *cannot* be stubbed/verified: final/private/equals()/hashCode().
Mocking methods declared on non-public parent classes is not supported.
如果我从TaskService.createTask
方法中删除@Async
,则不会发生上述异常。
Spring Boot版本:1.4.0.RELEASE
Mockito版本:1.10.19
Spring Boot中有一个错误,我们希望在1.4.1中修复。问题是您的mockTaskService
仍被异步调用,这会破坏Mockito。
您可以通过为< code>TaskService创建一个接口并创建一个模拟接口来解决这个问题。只要您将< code>@Async注释只留在实现上,事情就会正常进行。
大概是这样的:
public interface TaskService {
void createTask(TaskResource taskResource, UUID linkId);
}
@Service
@Transactional(readOnly=true)
public class AsyncTaskService implements TaskService {
@Async
@Transactional(readOnly = false)
@Override
public void createTask(TaskResource taskResource, UUID linkId) {
// do some heavy task
}
}
发现通过将Async模式更改为AeyJ解决了问题:
@EnableCaching
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(lazyInit = true)
@EnableAsync(mode = AdviceMode.ASPECTJ) // Changes here!!!
public class Main {
public static void main(String[] args) {
new SpringApplicationBuilder().sources(Main.class)
.run(args);
}
}
我会接受这是一个临时的黑客解决方案,直到我明白这个问题的真正根本原因。
我的测试存根是 我在这里做错了什么?
问题内容: 如何用void返回类型模拟方法? 我实现了一个观察者模式,但是我无法用Mockito对其进行模拟,因为我不知道如何做。 我试图在互联网上找到一个例子,但没有成功。 我的课看起来像这样: 系统不会通过模拟触发。 我想显示上述系统状态。并根据他们做出断言。 问题答案: 看看Mockito API文档。由于链接的文档提到(点#12),你可以使用任何的家人从框架的的方法来嘲笑无效的方法。 例如
我有一个调用Repository方法并返回列表的服务类。现在我想嘲笑它。我的单元测试场景如下: 向模拟存储库添加一些模拟对象 返回模拟对象列表的查询服务类 断言列表大小 我的存储库类: 我的服务等级: 我的对象类: 和我的测试课程: 但是由于我是Mockito的新手,这对我来说有点困难。我想知道如何从FoodService类中获取列表,并且它应该返回在测试类中制作的假对象。
我正试图模拟一个泛型方法,但无论我做什么尝试,都会得到类转换异常。正在测试的类是 而测试类是 其他帮助器类和接口有: 此外,出现此错误的原因可能是:1。您使用final/private/equals()/hashCode()方法中的任一个作为存根。这些方法不能被截取/验证。不支持在非公共父类上声明的模拟方法。2.内部when()不是对mock而是对其他对象调用method。
使用mockito模拟一个方法会确保永远不会调用被模拟的方法吗?我有一个主类,它包含一些我想为其编写单元测试的代码,还有一个单元测试类MainTest,它包含主类的单元测试。 eg: 源类: JUnit测试(使用mockito) 这项测试失败了。为什么?
我正在使用Mockito 1.9.5。我如何嘲笑从受保护的方法返回的内容?我有这个受保护的方法... 然而,当我尝试在JUnit中这样做时: 在最后一行,我得到一个编译错误“方法‘myMethod’不可见”如何使用Mockito来模拟受保护的方法?如果答案是这样,我愿意升级我的版本。